[英]Search and replace with sed in specific intervall after keyword
假設一個文本file
包含一些帶有關鍵字foo
。
> cat file
bar bar baz qux
bar foo bar baz
bar foo qux bar
我想用字符z
替換出現在(包括)關鍵字結尾之后的n和m字符之間的任何字符r
。
n=1和m=3 的示例:
> sought_command file
bar bar baz qux
bar foo baz baz # Replacement only here!
bar foo qux bar
n=4和m=6 的示例:
> sought_command file
bar bar baz qux
bar foo bar baz
bar foo qux baz # Replacement only here!
使用 sed:
n=1;m=3
sed -E ':a;s/(foo( *[^ ]){'"$n"','"$m"'} *)r/\1z/;ta' file
其中:a
定義了一個標簽, ta
跳轉到這個標簽,直到沒有更多的“r”要替換。
你可以使用這個 awk 腳本:
$> cat mark.awk
p = index($0, kw) { # only for lines containing keyword
b = p+length(kw) + 1 # get to next position after kw match
part = substr($0, b+n, m) # get substring between start and end points
gsub(/r/, "z", part) # replace "r" by "z" only in the substring
# new reconstruct the original line using substr commands
$0 = substr($0, 1, b+n-1) part (b+m+1<length($0)?substr($0, b+m+1):"")
} 1 #default action to print a line
現在在命令行上使用您的參數運行此腳本:
$> awk -v kw='foo' -v n=1 -v m=3 -f mark.awk file
bar bar baz qux
bar foo baz baz
bar foo qux bar
$> awk -v kw='foo' -v n=4 -v m=6 -f mark.awk file
bar bar baz qux
bar foo bar baz
bar foo qux baz
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.