我正在编写一个脚本,使用sed在文件中交换两个单词的第一个出现。
sed命令看起来像这个sed -E 's/(github.com) (github-secondary)/\2 \1/g' ~/.ssh/config
该命令无效,我相信原因是因为捕获组位于不同的行上。如何指定捕获组之间可以有任何间距?
示例输入:
hi
hi
github.com
github.com
j
x
github-secondary
ljlk
lkjfds
简单输出:
hi
hi
github-secondary
github.com
j
x
github.com
ljlk
lkjfds
答案 0 :(得分:0)
使用perl会更容易,它更好地支持处理多行输入。在你的情况下:
$ perl -0777 -pe 's/(github\.com)(.*)(github-secondary)/$3$2$1/s' x
hi
hi
github-secondary
github.com
j
x
github.com
ljlk
lkjfds
-0777告诉perl将整个文件视为单个记录。 /s
表示不特别处理换行符,因此(.*)
匹配尽可能多的字符/行。
答案 1 :(得分:0)
sed用于单个行上的简单替换,即全部。您不需要捕获组或将整个文件读入内存以从您发布的输入中获取所需的输出:
$ awk '
!x{x=sub(/github-secondary/,"github.com")}
!y{y=sub(/github\.com/,"github-secondary")}
1' file
hi
hi
github-secondary
github.com
j
x
github.com
ljlk
lkjfds
如果这还不够,请编辑您的问题,以显示更具真实代表性的样本输入和预期输出,并阐明您的要求。