我有一个XML文件,偶尔会将行分为2行:第一行以
结尾。我希望连接任何这样的行并删除
,或者用空格替换它。
e.g。
<message>hi I am
here </message>
需要成为
<message>hi I am here </message>
我试过了:
sed -i 's/ \/n/ /g' filename
没有运气。
非常感谢任何帮助!
答案 0 :(得分:2)
你可以使用这个awk:
awk -F" " '/ $/ {a=$1; next} a{print a, $0; a=""; next} 1' file
-F" "
将
设置为分隔符,以便第一个字段始终是字符串的所需部分。/ $/ {a=$1; next}
如果该行以
结尾,请将其存储在a
中并跳转到下一行。a{print a, $0; a=""; next}
如果设置了a
,请将其与当前行一起打印。然后取消设置a
以用于将来的循环。最后跳到下一行。1
为真,打印当前行。$ cat a
yeah
<message>hi I am
here </message>
hello
bye
$ awk -F" " '/ $/ {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(/ \n/," ")+7' file
在此测试您的示例:
kent$ echo "<message>hi I am
here </message>"|awk -v RS="" 'gsub(/ \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/ \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/ \n/ /g # When end of file is reached perform this substitution
' file