Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如果在非连续行中前面带有特定字符,则删除换行符_Bash_Unix_Sed_Replace - Fatal编程技术网

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