在bash文件中进行多次替换的最紧凑或最有效的方法是什么

时间:2010-02-25 20:25:05

标签: bash sed

我有一个文件data.base,如下所示:

1234 XXXX
4321 XXXX
9884 ZZZZ
5454 YYYY
4311 YYYY
9882 ZZZZ
9976 ZZZZ

(......这样的随机事件直到10000行)

我想创建一个名为data.case的文件,它从data.base派生,只是替换了XXXX,YYYY,ZZZZ的浮点数。

我想知道在bash或朋友身上做到这一点最紧凑/最有效/最短的方法。

我通常做的是:

sed -e "s/XXXX/1.34555/g" data.base > temp1
sed -e "s/YYYY/2.985/g" temp1 > temp2
sed -e "s/ZZZZ/-4.3435/g" temp2 > data.case
rm -fr temp1 temp2

但是当我不得不处理超过3次替换时,我认为这不是最紧凑或最有效的方法。

由于

由于

5 个答案:

答案 0 :(得分:4)

使用选项在同一个sed中执行多个命令:

sed "s/XXXX/1.34555/g; s/YYYY/2.985/g"; s/ZZZZ/-4.3435/g" data.base > data.case

答案 1 :(得分:2)

$ cat sedcommands
s/XXXX/1.34555/g
s/YYYY/2.985/g
s/ZZZZ/-4.3435/g
$ sed -f sedcommands data.base > data.case

答案 2 :(得分:1)

你可以在awk中使用关联数组

awk 'BEGIN{
 # add as needed
 s["XXXX"]=1.3455
 s["YYYY"]=2.985
 s["ZZZZ"]=-4.3435
}
($2 in s) {  print $1,s[$2] }' file

输出

$ ./shell.sh
1234 1.3455
4321 1.3455
9884 -4.3435
5454 2.985
4311 2.985
9882 -4.3435
9976 -4.3435

答案 3 :(得分:0)

sed -e“s / XXXX / 1.34555 / g; s / YYYY / 2.985 / g; s / ZZZZ / -4.3435 / g”

或将它们放在cmd文件中 并列出来。

答案 4 :(得分:0)

虽然sed可以在一次传递中执行多次替换,但 general UNIX approach更广泛适用且可与其他命令结合使用使用命令管道:

cat data.base | \
   sed -e "s/XXXX/1.34555/g" | \
   sed -e "s/YYYY/2.985/g" | \
   sed -e "s/ZZZZ/-4.3435/g" > data.base

最后的重定向将“unlinkcat用作输入的旧data.base;但是,您仍然可以使用临时文件,以便您可以拦截错误条件,而不会丢失原始data.base。

(使用管道时,熟悉tee程序非常有用,该程序在将文件传递给文件的同时将其保存到文件中。