Unix' sed'循环中的命令

时间:2015-08-14 12:12:33

标签: bash unix sed

我想用sed命令编写一个脚本,因为我猜这是最适合我目标的命令。 有一个名为NAME的文件,它由在列中排序的不同名称组成,如:

STEVE
JOHN
CLARE

脚本应该:

  1. $value档案
  2. 获取NAME
  3. $value替换为常量值(' ARNOLD')sed 's/"'$i'"/ARNOLD/g' test1.log>test2.log(test1和test2文件完全相同)。
  4. 我准备了我的脚本版本,但它仅适用于名称列表中的最新值:

    while read i; do sed 's/'"$i"'/ARNOLD/g' test1.log >test2.log ; done<name
    

3 个答案:

答案 0 :(得分:1)

您可以使用sed生成更改,然后使用第一个输出作为另一个sed的脚本来阅读

sed 's/.*/s\/&\/ARNOLD\/g/' NAME | sed -f- test1.log >test2.log

解释

sed 's/.*/s\/&\/ARNOLD\/g/'

创建

s/STEVE/ARNOLD/g
s/JOHN/ARNOLD/g
s/CLARE/ARNOLD/g

然后通过管道传输到

sed -f-

-f读取脚本文件
-是管道的标准配置

答案 1 :(得分:0)

每次脚本循环时,都会以未修改的test1.log开头并更改一个名称。这意味着只有更改的姓氏才会显示在test2.log

每个循环取消所有先前的更改。

答案 2 :(得分:0)

从原始test1.log制作副本时,可以覆盖test1.log。 您可以使用sed -i

sed 's/'"$i"'/ARNOLD/g' test1.log >test2.log && mv test2.log test1.log

此解决方案需要大量I / O,并且比@ Ed的解决方案更糟糕。 我刚刚添加它以显示@msw注意到的问题是如何解决的。