繁体   English   中英

使用sed和/或awk,如何在文件中的所有文本上进行sed交换,直到看到与正则表达式匹配的行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM