使用 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}'
答案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