替换换行符

时间:2014-05-07 21:10:38

标签: linux sed newline

我有一个XML文件,偶尔会将行分为2行:第一行以
结尾。我希望连接任何这样的行并删除
,或者用空格替换它。

e.g。

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

需要成为

<message>hi I am here </message>

我试过了:

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

没有运气。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:2)

你可以使用这个awk:

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

解释

  • -F"&#13;"&#13;设置为分隔符,以便第一个字段始终是字符串的所需部分。
  • /&#13;$/ {a=$1; next}如果该行以&#13;结尾,请将其存储在a中并跳转到下一行。
  • a{print 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} a{print a, $0; a=""; next} 1' a
yeah
<message>hi I am here </message>
hello
bye

答案 1 :(得分:2)

尝试这个gawk one-liner:

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>

答案 2 :(得分:2)

这对你有用:

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.

答案 3 :(得分:2)

这是一个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