示例:对于每3n + 1和3n + 2行,是否有办法使用sed删除/替换文件中的模式?
例如,转
Line 1n/
Line 2n/
Line 3n/
Line 4n/
Line 5n/
Line 6n/
Line 7n/
...
Run Code Online (Sandbox Code Playgroud)
至
Line 1 Line 2 Line 3n/
Line 4 Line 5 Line 6n/
...
Run Code Online (Sandbox Code Playgroud)
我知道这可能是由awk处理的.但是sed怎么样?
好吧,我只是使用awk那个1,因为它有点复杂但是,如果你真的打算使用sed,下面的命令会将三行的组合成一行(这似乎是你所追求的)基于标题和文字,尽管/n对换行有奇怪的用法):
sed '$!N;$!N;s/\n/ /g'
Run Code Online (Sandbox Code Playgroud)
请参阅以下脚本以了解如何测试:
$ printf 'Line 1\nLine 2\nLine 3\nLine 4\nLine 5\n' | sed '$!N;$!N;s/\n/ /g'
Line 1 Line 2 Line 3
Line 4 Line 5
Run Code Online (Sandbox Code Playgroud)
子命令如下:
$!N将下一行追加到模式空间,但前提是你不在最后一行(你这样做两次才能获得三行).模式空间中的每一行都由换行符分隔.s/\n/ /g 用空格字符替换模式空间中的所有换行符,有效地将三行组合成一行.1类似于:
awk '{if(NR%3==1){s="";if(NR>1){print ""}};printf s"%s", $0;s=" "}'
Run Code Online (Sandbox Code Playgroud)
由于您不希望每行末尾有一个无关的空间,因此需要引入s变量,这很复杂.
由于sed变体较小(一旦你理解它变得不那么复杂),你可能最好坚持下去.好吧,至少要达到你想要组合17行组的地步,或做一些比sed想要处理的更复杂的事情:-)
好的。以下是通常使用 awk 和 sed 处理它的方法。
\n\nawk:
\n\nawk 'NR % 3 { sub(/pattern/, substitution) } { print }' file | paste -d' ' - - -\nRun Code Online (Sandbox Code Playgroud)\n\nsed\xef\xbc\x9a
\n\nsed '{s/pattern/substitution/p; n;s/pattern/substitution/p; n;p}' file | paste -d' ' - - -\nRun Code Online (Sandbox Code Playgroud)\n\n它们都替换了pattern in3n+1和3n+2lines intosubstitution并保持3nline 不变。
paste - - -是将标准输出折叠 3 的 bash 习惯用法。
| 归档时间: |
|
| 查看次数: |
2439 次 |
| 最近记录: |