我从shell脚本中调用一个程序,它会创建一个带有以下格式的输出文件:
我想把这个改成:
在VI编辑器中,我可以执行
aaaaa\
bbbbb\
ccccc\
我想把这个改成:
。
aaaaabbbbbccccc
在VI编辑器中,我可以执行
ggVGJ
,然后用""替换所有\。但我想通过脚本来完成这个任务。以下是使用GNU sed
的一种方法:
sed ':a; N; $!ba; s/\\\n//g; s/\\$//' file
另一种使用 awk
的方法,可能会提供更好的性能:
awk '{ sub ("\\\\$", ""); printf "%s", $0 } END { print "" }' file
结果:
aaaaabbbbbccccc
解释:
awk
的解决方案通过替换删除尾随的反斜杠,并printf每行(不带换行符)。END
(在脚本末尾执行)然后打印一个换行符。这比sed
的解决方案更好,因为它创建了一个名为a
的标签,并将下一行输入附加到模式空间中。$!ba
表示“如果不是最后一行输入,则跳转到标签a
”。第一个替换然后从模式空间中删除每个反斜杠和换行符。第二个替换删除最后的尾随反斜杠。对于小文件,此解决方案应该很快,但与相同文件的awk
一样快。虽然...编写速度更快。
以下是一种使用 sed
和 tr
的方法:
sed 's/\\$//' < sample.txt | tr -d '\n'
echo
:sed 's/\\$//' < sample.txt | tr -d '\n'; echo
... && ... || ...
结构中使用,则可以像这样将两个步骤分组:{ sed 's/\\$//' < sample.txt | tr -d '\n'; echo; }
sed 's/\\$//' < sample.txt | tr -d '\n' | cat > sample.txt
然后在vi中打开它,我会得到[noeol]
标志。因此,文件的最后一行没有换行符。 - arunmoezhised 's/\\$//' file | tr -d '\n'; echo
。 - Steve$ cat tmp.txt
aaaaa\
bbbbb\
ccccc\
$ cat tmp.txt | tr -d "\\\r\n"
aaaaabbbbbccccc
另外一种方式,使用纯 bash:
$ cat file.txt
aaaaa\
bbbbb\
ccccc\
$ { cat file.txt ; echo; } | while read line; do echo $line; done
aaaaabbbbbccccc
$
read
命令会自动处理\符号的换行(使用-r开关可禁用此行为)。在这个例子中,cat
后面的echo
是必要的,因为你的示例文本的最后一行以\
结尾,因此read命令不认为它已经到达了行末并且不输出任何内容。echo
只是在流的末尾插入一个空行来清除这个问题。尝试这行代码;
awk -F'\\\\$' '{printf "%s", $1}END{print ""}' file
这是一个十分丑陋的hack,但您可以使用gcc预处理器来实现:
$ cat file.txt
aaaaa\
bbbbb\
ccccc\
$ cat file.txt | gcc -xc -E -P -w - | grep .
aaaaabbbbbccccc
$
使用 awk
和 sed
中的一个:
sed 's/\\$//g' file | awk '{printf "%s", $1}'
sed
命令移除行末的斜杠。在斜杠后面,$
表示行末。由于在 sed
中,斜杠被视为元字符,因此需要额外的 \
进行转义。将 sed 的输出导入到 awk printf
中可将多行打印成一行。 $0
代表整行。
abc
可以是任何东西,而且文件非常长。 - arunmoezhiawk
解决方案。希望有所帮助。 - Steve