替换换行符[重复]

Posted

技术标签:

【中文标题】替换换行符[重复]【英文标题】:Replacing newline character [duplicate] 【发布时间】:2014-06-25 01:28:37 【问题描述】:

我有一个 XML 文件,它偶尔会分成 2 行:第一行以 
 结尾。我想连接任何这样的行并删除
,也许用空格替换它。

例如

<message>hi I am&#13;
here </message>

需要成为

<message>hi I am here </message>

我试过了:

sed -i 's/&#13;\/n/ /g' filename

没有运气。

非常感谢任何帮助!

【问题讨论】:

SO 正确建议这是一个相关问题:***.com/questions/1251999/… 【参考方案1】:

你可以使用这个 awk:

awk -F"&#13;" '/&#13;$/ a=$1; next aprint a, $0; a=""; next 1' file

说明

-F"&amp;#13;"&amp;#13; 设置为分隔符,这样第一个字段将始终是字符串的所需部分。 /&amp;#13;$/ a=$1; next 如果该行以&amp;#13; 结尾,则将其存储在a 中并跳转到下一行。 aprint a, $0; a=""; next 如果设置了a,则与当前行一起打印。然后为将来的循环取消设置 a。最后跳到下一行。 1 为真,打印当前行。

样本

$ cat a
yeah
<message>hi I am&#13;
here </message>
hello
bye

$ awk -F"&#13;" '/&#13;$/ a=$1; next aprint a, $0; a=""; next 1' a
yeah
<message>hi I am here </message>
hello
bye

【讨论】:

【参考方案2】:

试试这个笨拙的单线:

awk -v RS="" 'gsub(/&#13;\n/," ")+7' file

用你的例子在这里测试过:

kent$ echo "<message>hi I am&#13;
here </message>"|awk -v RS="" 'gsub(/&#13;\n/," ")+7'  
<message>hi I am here </message>

【讨论】:

【参考方案3】:

这对你有用:

sed -i ':q;N;s/&.*\n/ /g;t q' <filename>

但是,用 sed 替换换行符始终是一个 bash(读得不好)的主意。出错的几率很高。

另外一个更简单的解决方案:

tr -s '\&\#13\;\n' ' ' < <filename>

tr 正在用空格替换所有匹配的字符,所以如果没有 -s 它会打印出来

<message>hi I am      here </message>

-s 来自手册页:

   -s, --squeeze-repeats
          replace  each  input  sequence of a repeated character that is listed in SET1 with a single occurrence of that character.

【讨论】:

【参考方案4】:

这是一个 GNU sed 版本:

sed ':a;$bc;N;ba;:c;s/&#13;\n/ /g' file

说明:

sed '
    :a              # Create a label a
    $bc             # If end of file then branch to label c
    N               # Append the next line to pattern space
    ba              # branch back to label a to repeat until end of file
    :c              # Another label c
    s/&#13;\n/ /g   # When end of file is reached perform this substitution
' file

【讨论】:

这在我对我的文件运行 dos2unix 后起作用。感谢大家的帮助。

以上是关于替换换行符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 tr 用空格替换换行符[重复]

sed 通过换行符替换字符串,但不是相反[重复]

在 vim 搜索和替换中,换行符呈现为“^@”[重复]

正则表达式 Python - 用单个空格替换换行符、制表符、空格的任意组合[重复]

sed 没有给我正确的 Mac 换行符替换操作 - GNU sed 和 BSD / OSX sed [重复]

如何从句子中删除多余的空格、制表符和换行符,并仅用一个空格替换它们? [复制]