使用sed删除每第n行的换行符

use*_*884 3 linux bash sed

示例:对于每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怎么样?

pax*_*blo 6

好吧,我只是使用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想要处理的更复杂的事情:-)


Jas*_* Hu 0

好的。以下是通常使用 awk 和 sed 处理它的方法。

\n\n

awk:

\n\n
awk 'NR % 3 { sub(/pattern/, substitution) } { print }' file | paste -d' ' - - -\n
Run Code Online (Sandbox Code Playgroud)\n\n

sed\xef\xbc\x9a

\n\n
sed '{s/pattern/substitution/p; n;s/pattern/substitution/p; n;p}' file | paste -d' ' - - -\n
Run Code Online (Sandbox Code Playgroud)\n\n

它们都替换了pattern in3n+13n+2lines intosubstitution并保持3nline 不变。

\n\n

paste - - -是将标准输出折叠 3 的 bash 习惯用法。

\n