我有一个文本文件,每隔一行以%字符结尾。我想找到模式“%+换行符”并将其替换为“%”。换句话说,我要删除%之后的换行符,而不是其他换行符。
例如,我要更改以下内容:
abcabcabcabc%
123456789123
abcabcabcabc%
123456789123
到
abcabcabcabc%123456789123
abcabcabcabc%123456789123
我尝试了以下sed命令,但无济于事。
sed 's/%\n/%/g' < input.txt > output.txt
答案 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