我从shell脚本调用一个程序,它会创建一个输出文件 使用这种格式:
aaaaa\
bbbbb\
ccccc\
我想将其更改为:
aaaaabbbbbccccc
在VI编辑器中,我可以ggVGJ
然后将所有\替换为“”。
但我希望通过脚本完成这项工作。
答案 0 :(得分:5)
这是使用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
快。虽然......写得更快。
答案 1 :(得分:3)
以下是使用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; }
答案 2 :(得分:3)
另一种方式,使用纯bash:
$ cat file.txt
aaaaa\
bbbbb\
ccccc\
$ { cat file.txt ; echo; } | while read line; do echo $line; done
aaaaabbbbbccccc
$
这是有效的,因为bash read
命令实际上自动处理\ continuation(使用-r切换到read
来禁用此行为)。 {1}}之后的echo
是此示例所必需的,因为示例文本的最后一行以cat
结尾,因此read命令不会认为它已到达结尾行,并没有输出任何东西。 \
只是在流的末尾插入一个空行来清理它。
答案 3 :(得分:3)
我猜这个解决方案是最小的:
$ cat tmp.txt
aaaaa\
bbbbb\
ccccc\
$ cat tmp.txt | tr -d "\\\r\n"
aaaaabbbbbccccc
答案 4 :(得分:2)
试试这一行;
awk -F'\\\\$' '{printf "%s", $1}END{print ""}' file
答案 5 :(得分:2)
这是一个 真的 丑陋的黑客,但您可以使用gcc preprocessor:
$ cat file.txt
aaaaa\
bbbbb\
ccccc\
$ cat file.txt | gcc -xc -E -P -w - | grep .
aaaaabbbbbccccc
$
为什么这有风险?如果您的输入文本恰好包含预处理程序指令,那么它们将被解释,从而导致混乱。
答案 6 :(得分:1)
一位awk
和sed
:
sed 's/\\$//g' file | awk '{printf "%s", $1}'
sed
命令删除行尾的斜杠。 $
表示斜线后的行尾。由于slash
被视为sed
中的元字符,因此您需要额外的\
来逃避它。将sed的输出管道输出到awk printf
将多行打印在一起。 $0
代表整行。