替换文件中每个字符串出现的字符串,在该文件的第一行添加额外的行

时间:2014-10-14 12:13:20

标签: awk sed grep

我进行了搜索并找到了如何替换文件中每个字符串的出现次数。除此之外,我想仅在第一次出现字符串时向文件添加一行。

我知道这个

   grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'

将替换每次出现的字符串。那么如何在字符串的第一次匹配时向该文件添加一行?谁能知道如何做到这一点?感谢你的时间。

编辑:

Exaple:用文件中的TTT替换xxx,在第一场比赛的文件开头添加一行。

输入:file1,file2。

file1
  abc xxx pp
  xxxy rrr 
  aaaaaaaaaaaddddd


file2 
  aaaaaaaaaaaddddd   

输出

file1
  #ADD LINE HERE FOR FIRST MATCH DONT ADD FOR REST OF MATCHES
  abc TTT pp
  TTTy rrr 
  aaaaaaaaaaaddddd

file2
  aaaaaaaaaaaddddd

2 个答案:

答案 0 :(得分:2)

来自this question的答案。

这样的事情似乎有效:

sed -e '0,/windows/{s/windows/linux/; p; T e; a \new line
;:e;d}; s/windows/linux/g'

从文件的开头到/windows/的第一个匹配:

  • windows替换为linux
  • 打印行
  • 如果s/windows/linux/没有替换任何内容跳转到标签e
  • 添加第new line
  • 创建标签e
  • 删除当前模式空间,阅读下一行并重新开始处理

可替换地:

awk '{s=$0; gsub(/windows/, "linux")} 7; (s ~ /windows/) && !w {w=1; print "new line"}' file
  • 将行保存在s
  • windows替换为linux
  • 打印行(7为true,任何真实模式运行默认操作{print}
  • 如果原始行包含windowsw为false(默认情况下变量为空字符串,而awk中的空字符串为false-y)
    • w设为1(真值y)
    • 添加新行

答案 1 :(得分:1)

如果我理解正确,您只需要:

find . -type f -print |
while IFS= read -r file; do
    awk 'gsub(/windows/,"unix"){if (!f) $0 = $0 ORS "an added line"; f=1} 1' "$file" > tmp &&
    mv tmp "$file"
done

请注意,上面的内容,如sed和grep,将使用RE,而不是字符串。要使用字符串需要在awk中使用index()和substr(),使用sed是不可能的,而使用grep需要额外的标志。

如果使用gNU awk为多字符RS进行更改,则向文件添加一条前导线(我们也可以使用类似于sed的就地编辑,因为我们正在使用gawk):

find . -type f -print |
while IFS= read -r file; do
    gawk -i inplace -v RS='^$' -v ORS= 'gsub(/windows/,"unix"){print "an added line"} 1' "$file"
done