Unix通过unix替换文件中的特定类型的字符串

时间:2012-06-06 04:46:06

标签: unix sed

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

情景是:

用户输入如下:

abc = 21
xyz=32;34;35

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

此文件的格式如下: 的test.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"

任何人都可以看看这个吗?

2 个答案:

答案 0 :(得分:1)

为什么你不能管理所有条件?

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

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

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

答案 1 :(得分:0)

使用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