我正在尝试使用 sed 在文件中第 n 个匹配的行上查找匹配字符串。我想使用表达式来 machnum
和该行之后的“任何内容”,并将其替换为num x
.
示例文件:
START
num 1
num 1
num 1
num n
END
sed ':a;N;$!ba; s/num .*/num x/1' example
输出:
START
num x
sed ':a;N;$!ba; s/num 1/num x/1' example
输出:
START
num x
num 1
num 1
num n
END
我试图使用.*
表达式来匹配后面的任何内容num
并将其替换为,
num x
但我的结果将文件末尾遗漏了。用该行上的实际完整字符串替换.*
表达式可以得到所需的结果,但该行上的字符后面必须有“任何内容”。
答案1
你的正则表达式不完全正确。
$ sed ':a;N;$!ba; s/\nnum[^\n]*/\nnum x/4' file
答案2
sed 是在单行上执行 s/old/new 的最佳工具,对于其他任何操作,只需使用 awk;
$ awk -v n=4 '/num/ && ((++c) == n){$0="num x"} {print}' file
START
num 1
num 1
num 1
num x
END