【问题标题】:Unix replace a particular type of string in file through unixUnix通过unix替换文件中特定类型的字符串
【发布时间】:2012-06-06 04:46:06
【问题描述】:

我有一种情况需要替换文件中特定类型的字符串。

场景是:

这样的用户输入:

abc = 21
xyz=32;34;35

用户可以在 xyz 中输入多个数字,但格式应为“;”分隔值 现在我需要替换特定文件中的这些值假设 test.txt

此文件的格式如下: 测试.txt

cond0=abc
cond1=xyz
Cond2=abcxyz%

因此输出应该是这样的

cond0=21
cond1=32;34;35
cond2=2132%;2134%;2135%

我正在使用以下命令来执行此操作,但由此我无法在 cond2 中获得正确的输出

sed "s/abc/${abc}/g" "$TEST_DIR/$file" > "$TEST_DIR/$file.bak" && mv "$TEST_DIR/$file.bak" "$TEST_DIR/$file"

sed "s/xyz/${xyz}/g" "$TEST_DIR/$file" > "$TEST_DIR/$file.bak" && mv "$TEST_DIR/$file.bak" "$TEST_DIR/$file"

谁能看看这个?

【问题讨论】:

    标签: unix sed


    【解决方案1】:

    为什么不能通过管道处理所有条件?

    sed "s/abc/$abc/g" <$TEST_DIR/$file | sed "s/xyz/$xyz/g" >$TEST_DIR/newfile
    mv $TEST_DIR/newfile $TEST_DIR/$file
    

    请注意,您必须进行这两个操作,即写入临时文件然后重命名。否则你最终会清除文件。

    输入 "" 重定向由 shell 处理,当他们看到 ">somefile" 时,"somefile" 被截断。所以你永远不可能成功地做到cat &lt;file &gt;file

    【讨论】:

      【解决方案2】:

      使用 bash,

      abc=21
      xyz='32;34;35'
      abcxyz=$(sed -r "s/^|;/\0${abc}/g;s/;|$/%\0/g" <<< "${xyz}")
      sed -i~ "s/abcxyz%/${abcxyz}/;s/abc/${abc}/;s/xyz/${xyz}/" inputFile
      

      【讨论】:

        猜你喜欢
        • 2012-11-19
        • 2017-12-28
        • 1970-01-01
        • 2013-02-20
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 2013-02-19
        • 2016-09-04
        相关资源
        最近更新 更多