如何组合所有以反斜杠字符结尾的行?

如何组合所有以反斜杠字符结尾的行?

使用 sed 或 awk 等常见命令行工具,是否可以连接以给定字符(如反斜杠)结尾的所有行?

例如,给定文件:

foo bar \
bash \
baz
dude \
happy

我想得到这个输出:

foo bar bash baz
dude happy

答案1

一个更短、更简单的 sed 解决方案:

sed  '
: again
/\\$/ {
    N
    s/\\\n//
    t again
}
' textfile

如果使用 GNU 则为一行sed

sed ':x; /\\$/ { N; s/\\\n//; tx }' textfile

答案2

使用 perl 可能是最简单的(因为 perl 就像 sed 和 awk,我希望你能接受):

perl -p -e 's/\\\n//'

答案3

这是一个 awk 解决方案。如果一行以 结尾\,则去掉反斜杠并打印该行,不带终止换行符;否则打印带有终止换行符的行。

awk '{if (sub(/\\$/,"")) printf "%s", $0; else print $0}'

sed 的情况也还不错,尽管 awk 显然更具可读性。

答案4

另一种常见的命令行工具是ed,它默认会就地修改文件,因此不会修改文件权限(有关更多信息,ed请参阅使用脚本中的 ed 文本编辑器编辑文件

str='
foo bar \
bash 1 \
bash 2 \
bash 3 \
bash 4 \
baz
dude \
happy
xxx
vvv 1 \
vvv 2 \
CCC
'

# We are using (1,$)g/re/command-list and (.,.+1)j to join lines ending with a '\'
# ?? repeats the last regex search.
# replace ',p' with 'wq' to edit files in-place
# (using Bash and FreeBSD ed on Mac OS X)
cat <<-'EOF' | ed -s <(printf '%s' "$str")
H
,g/\\$/s///\
.,.+1j\
??s///\
.,.+1j
,p
EOF

相关内容