首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在迭代时替换文件中的字符串。

无法在迭代时替换文件中的字符串。
EN

Stack Overflow用户
提问于 2018-09-19 03:58:14
回答 1查看 106关注 0票数 3

final.txt看起来像:

代码语言:javascript
复制
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

代码语言:javascript
复制
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!

这是可行的,所以我现在可以在窗口看到这个:

代码语言:javascript
复制
 [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没有改变:

代码语言:javascript
复制
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"}"

也试过这样做:

代码语言:javascript
复制
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

我是不是错过了更多的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-21 07:21:23

在大多数情况下,您的尝试都是有益的,但是在这两次尝试中,涉及更改文件内容的部分都是不正确的。

Problem 1

您感到惊讶的是,下面的尝试没有替换文件的内容。不会的。

代码语言:javascript
复制
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可以解决您的问题,这是在正确的轨道上,但您似乎错过了一些技巧。

  1. sed搜索和替换部分中定义了变量,但问题在于引号。bash shell中的变量在单引号时不展开,而仅用双引号展开。
  2. 下一个问题是在sed中使用的去限制器字符串,默认情况下是/.但是请记住,源字符串和替换字符串都有/,因此sed不会理解原始文本和替换文本是什么。您需要定义一个非/的去限制器,也需要定义不是字符串一部分的任何元字符。在你的情况下,我会推荐| sed“的$CFILENAME_
  3. 现在最大的问题是在您的-i命令中使用sed标志,这意味着对文件进行就地编辑。请记住,您正在用while read构造逐行读取循环中的文件,现在在解析每一行之后编辑该文件。你用错误的方式搞砸了炮弹的方向。理想的方法是逐行将编辑重定向到临时文件,并在循环完成后将其移动到原始文件中。 sed“的$CFILENAME_

如上面所示,使用附加到文件的>>。循环完成后,使用mv恢复到原始文件。

代码语言:javascript
复制
mv -- temp_final.txt final.txt
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52397803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档