如果在非连续行上以特定字符开头,请删除换行

时间:2019-06-12 21:37:16

标签: bash unix sed replace

我有一个文本文件,每隔一行以%字符结尾。我想找到模式“%+换行符”并将其替换为“%”。换句话说,我要删除%之后的换行符,而不是其他换行符。

例如,我要更改以下内容:

abcabcabcabc%
123456789123
abcabcabcabc%
123456789123

abcabcabcabc%123456789123
abcabcabcabc%123456789123

我尝试了以下sed命令,但无济于事。

sed 's/%\n/%/g' < input.txt > output.txt

3 个答案:

答案 0 :(得分:3)

默认情况下,sed无法删除换行符,因为它一次读取一个换行符分隔的行。

在每个UNIX框上的任何外壳程序中的任何awk中,以%结尾的任意数量的行都可以连续或不连续:

$ awk '{printf "%s%s", $0, (/%$/ ? "" : ORS)}' file
abcabcabcabc%123456789123
abcabcabcabc%123456789123

并带有连续的%行:

$ cat file
now is the%
winter of%
our%
discontent

$ awk '{printf "%s%s", $0, (/%$/ ? "" : ORS)}' file
now is the%winter of%our%discontent

答案 1 :(得分:2)

您的数据样本表明没有连续的行以%结尾。

在这种情况下,您可以使用

sed '/%$/{N;s/\n//}' file.txt > output.txt

它的工作原理如下:

  • /%$/-查找所有以%结尾的行
  • {N;s/\n//}-块:
    • N-在模式空间中添加换行符,然后将输入的下一行追加到模式空间中
    • s/\n//-在当前模式空间中删除换行符。

请参见online sed demo

答案 2 :(得分:0)

在支持任意数量连续行的便携式sed中:

parse.sed

:a                # A goto label named 'a'
/%$/ {            # When the last line ends in '%'
  N               # Append the next line
  s/\n//          # Remove new-line
  ta              # If new-line was replaced goto label 'a'
}

像这样运行它:

sed -f parse.sed infile

infile 包含您的输入以及Ed Morton答案的输入时的输出:

abcabcabcabc%123456789123         
abcabcabcabc%123456789123
now is the%winter of%our%discontent