使用shell脚本合并txt文件的行

时间:2013-09-27 23:19:02

标签: bash shell unix vi

我从shell脚本调用一个程序,它会创建一个输出文件 使用这种格式:

aaaaa\
bbbbb\
ccccc\

我想将其更改为:

aaaaabbbbbccccc

在VI编辑器中,我可以ggVGJ然后将所有\替换为“”。 但我希望通过脚本完成这项工作。

7 个答案:

答案 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)

以下是使用sedtr的一种方式:

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)

一位awksed

sed 's/\\$//g' file | awk '{printf "%s", $1}'

sed命令删除行尾的斜杠。 $表示斜线后的行尾。由于slash被视为sed中的元字符,因此您需要额外的\来逃避它。将sed的输出管道输出到awk printf将多行打印在一起。 $0代表整行。