文件:
1
2
3
4
1
5
6
7
4
我想搜索一个字符串,在这种情况下1
,然后将下一个字符串更改4
为8
。
预期输出:
1
2
3
8
1
5
6
7
4
我试过了:
cat file | sed '/1/ s/4/8/'
但这只会在该行中查找要更改的字符串。
我也不能在原始文件中使用行号替换,因为第一个字符串和第二个字符串之间的行数可能不同。
我没有安装 GNU sed。
文件:
1
2
3
4
1
5
6
7
4
我想搜索一个字符串,在这种情况下1
,然后将下一个字符串更改4
为8
。
预期输出:
1
2
3
8
1
5
6
7
4
我试过了:
cat file | sed '/1/ s/4/8/'
但这只会在该行中查找要更改的字符串。
我也不能在原始文件中使用行号替换,因为第一个字符串和第二个字符串之间的行数可能不同。
我没有安装 GNU sed。
POSIX 指定的文件编辑器 ,
ex
能够做到这一点。ex
能够组合多个地址。所以/1/
意味着“转到”(或参考)“匹配正则表达式的下一行1
”。然后/4/
从该行到下一行匹配4
。并s//8/
具有通常的含义;就像在 Sed 中一样,传递给s
命令的空白正则表达式意味着“重用上次使用的正则表达式”,在这种情况下是4
.要打印修改后的文件但不保存更改,请改用以下命令:
只是为了更好地给出多个地址的概念,以下命令删除包含在第 27 行之后的第一行
cherry
之前的第一行:banana
x
表示保存更改并退出,%p
表示“打印整个文件”。(%
是 的同义词1,$
,它是从第一行到最后一行的地址范围。)要仅替换
PATTERN
a 之后发生的第一个,MARKER
您可以执行以下操作:使用范围(从第一个
MARKER
到文件末尾)和保持缓冲区。每次遇到匹配的行时PATTERN
,您都会交换缓冲区并检查保持空间中的行是否也匹配:如果匹配,则交换回来并转到脚本末尾;否则用当前行覆盖并替换。使用通用解决方案
awk
,考虑以下具有多个1
s 和4
s 的修改输入文件使用标志来指示
1
匹配,并使用计数器来知道正在修改哪个块。需要清除标志才能重新开始匹配循环可以简化为仅更改第一个块
Awk
解决方案:输出:
使用 awk 它更容易并且兼容所需的任何第 N 次出现
例子 :
只有第二个 4 被改变,但不是第一个或最后一个。