[英]Using sed and/or awk, how can do a sed swap on all text in a file until I see a line matching a regex?
如何在与正则表达式匹配的行之前的所有文本上执行sed正则表达式交换。
例如,我该怎么做这样的交换
s/foo/bar/g
对于此正则表达式匹配的第一个点之前的所有文本:
m/baz/
我不想在我的sed正则表达式中使用正面/负面的前瞻/后退,因为那些对大文件的操作非常昂贵。
如果你的意思是你想在给定的比赛之前的每一行做替换,这就是你的答案:
替换采用可选的地址范围; 你可以使用数字和模式。 在这种情况下,从第1行开始,直到你的模式:
sed '1,/baz/s/foo/bar/g'
在awk中:
awk '
/baz/ { done = 1 }
{
if (!done) {
gsub(/foo/, "bar")
}
print
}'
(它足够短,可以省略换行符,但它们使它可读)
Jefromi的答案中的这种变化应该做的就是不要触及Jonathan的评论中提到的“baz”出现的那条线。
sed '1,/baz/{/baz/!s/foo/bar/g}'
$ cat file
123 abc 01
456 foo 02 bar
789 ghi
baz
blah1
blah2
foo bar
$ awk -vRS="baz" 'NR==1{gsub("foo","bar")}1' ORS="baz" file
123 abc 01
456 bar 02 bar
789 ghi
baz
blah1
blah2
foo bar
baz
使用“baz”记录分隔符,然后第一条记录将是您要将“foo”更改为“bar”的记录。
与sed,Denni解决方案的变化在第一线照顾“baz”
sed '0,/baz/{/baz/!s/foo/bar/g}' file
这可能对你有用:
awk '/baz/{p=1};!p{gsub(/foo/,"bar")};1' file
或这个:
sed '/baz/,$!s/foo/bar/g' file
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.