簡體   English   中英

在關鍵字后的特定時間間隔內搜索並替換為 sed

[英]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替換出現在(包括)關鍵字結尾之后的nm字符之間的任何字符r

n=1m=3 的示例:

> sought_command file
bar bar baz qux
bar foo baz baz  # Replacement only here!
bar foo qux bar

n=4m=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM