final.txt看起来像:
build/create_changes.sh
build/create_changes.sh-meta.xml
src/aura/camping/camping.design
src/aura/camping/camping.design-meta.xml我只想将包含/aura/的文件替换为src/aura/camping。
if [ -e final.txt ]
then
ARRAY=()
while read CFILE
do
echo Analyzing file `basename $CFILE`
case "$CFILE"
in
*.design) TYPENAME="AuraDefinitionBundle";;
*) TYPENAME="UNKNOWN";;
esac
if [ "$TYPENAME" == "AuraDefinitionBundle" ]
then
if [ $(contains "${ARRAY[@]}" $(basename -- "$(dirname -- "$CFILE")")) != "y" ]
then
echo baseFile from new method cFile $CFILE
CFILENAME="$CFILE"
replace="src/aura/"$(basename -- "$(dirname -- "$CFILE")")
echo checkChanges "${CFILENAME/$CFILENAME/"$replace"}"
CFILE="${CFILENAME/$CFILENAME/"$replace"}"
echo baseFile from after change method cFile $CFILE
else
continue
fi
fi
done < final.txt
else
echo Change file not found!这是可行的,所以我现在可以在窗口看到这个:
[exec] baseFile from new method cFile src/aura/camping/camping.design
[exec] checkChanges src/aura/camping
[exec] baseFile from after change method cFile src/aura/camping但是文件final.txt没有改变:
build/create_changes.sh
build/create_changes.sh-meta.xml
src/aura/camping/camping.design
src/aura/camping/camping.design-meta.xml我就把它换了,CFILE="${CFILENAME/$CFILENAME/"$replace"}"
也试过这样做:
if [ $(contains "${ARRAY[@]}" $(basename -- "$(dirname -- "$CFILE")")) != "y" ]
then
CFILENAME="$CFILE"
ARRAY+=($(basename -- "$(dirname -- "$CFILE")"))
replace="src/aura/"$(basename -- "$(dirname -- "$CFILE")")
#CFILE="${CFILENAME/$CFILENAME/"$replace"}"
sed -i 's/$CFILENAME/$replace/' final.txt
else
continue
fi我是不是错过了更多的东西?
发布于 2018-09-21 07:21:23
在大多数情况下,您的尝试都是有益的,但是在这两次尝试中,涉及更改文件内容的部分都是不正确的。
Problem 1
您感到惊讶的是,下面的尝试没有替换文件的内容。不会的。
CFILE="${CFILENAME/$CFILENAME/"$replace"}"因为上面是一个用于字符串替换的bash内部构造。它只是替换存储在变量CFILENAME中的字符串内容,并将结果放到CFILE中。根本不做文件修改。
从您的输入判断,您的CFILENAME输入将是src/aura/camping/camping.design,而replace变量将是src/aura/camping。这样做会将字符串src/aura/camping放到变量CFILE,而不是变量CFILE指向的文件。
Problem 2
您似乎已经发现sed可以解决您的问题,这是在正确的轨道上,但您似乎错过了一些技巧。
sed搜索和替换部分中定义了变量,但问题在于引号。bash shell中的变量在单引号时不展开,而仅用双引号展开。sed中使用的去限制器字符串,默认情况下是/.但是请记住,源字符串和替换字符串都有/,因此sed不会理解原始文本和替换文本是什么。您需要定义一个非/的去限制器,也需要定义不是字符串一部分的任何元字符。在你的情况下,我会推荐|
sed“的$CFILENAME_-i命令中使用sed标志,这意味着对文件进行就地编辑。请记住,您正在用while read构造逐行读取循环中的文件,现在在解析每一行之后编辑该文件。你用错误的方式搞砸了炮弹的方向。理想的方法是逐行将编辑重定向到临时文件,并在循环完成后将其移动到原始文件中。
sed“的$CFILENAME_如上面所示,使用附加到文件的>>。循环完成后,使用mv恢复到原始文件。
mv -- temp_final.txt final.txthttps://stackoverflow.com/questions/52397803
复制相似问题