我进行了搜索并找到了如何替换文件中每个字符串的出现次数。除此之外,我想仅在第一次出现字符串时向文件添加一行。
我知道这个
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
答案 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}
)windows
且w
为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