Bash 如果在非连续行中前面带有特定字符,则删除换行符
我有一个文本文件,每隔一行以%字符结尾。我想找到模式“%+换行符”,并将其替换为“%”。换句话说,我想删除%后面的换行符,而不是其他换行符 例如,我想更改以下内容:Bash 如果在非连续行中前面带有特定字符,则删除换行符,bash,unix,sed,replace,Bash,Unix,Sed,Replace,我有一个文本文件,每隔一行以%字符结尾。我想找到模式“%+换行符”,并将其替换为“%”。换句话说,我想删除%后面的换行符,而不是其他换行符 例如,我想更改以下内容: abcabcabcabc% 123456789123 abcabcabcabc% 123456789123 到 我尝试了下面的sed命令,但没有成功 sed 's/%\n/%/g' < input.txt > output.txt sed's/%\n/%/g'output.txt 您的数据示例意味着没有以%结尾的连续
abcabcabcabc%
123456789123
abcabcabcabc%
123456789123
到
我尝试了下面的sed命令,但没有成功
sed 's/%\n/%/g' < input.txt > output.txt
sed's/%\n/%/g'output.txt
您的数据示例意味着没有以%
结尾的连续行
在这种情况下,您可以使用
sed '/%$/{N;s/\n//}' file.txt > output.txt
其工作原理如下:
-查找以/%$/
结尾的所有行%
-一个块:{N;s/\N/}
-向模式空间添加换行符,然后将下一行输入追加到模式空间N
-删除当前图案空间中的换行符s/\n/
请参阅。默认情况下,sed无法删除换行符,因为它一次只能读取一行换行符 对于以
%
结尾的任意行数,在每个UNIX框的任意shell中使用任意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
在支持任意数量连续线路的便携式sed中: 解析 按如下方式运行:
sed -f parse.sed infile
infle包含您的输入和Ed Morton答案的输入时的输出:
ABCABC%123456789123
ABCABC%123456789123
现在是我们%不满的%冬天
尝试sed'/%$/{N;s/%\N/%/}文件>输出
。如果没有以%
结尾的连续行,应该这样做。您不能只s/\n/
?这不像有多个换行符可供选择。@BenjaminW。是的,没错,这只是一个习惯,当涉及到正则表达式时,每件事都要有三倍的把握。
: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