Bash - 在用空格替换换行符之前删除破折号和换行符

nat*_*ath 3 command-line bash sed awk tr

我有一堆以下格式的文本文件:

Lorem ipsum dolor sit amet,
consetetur sadipscing elitr,
sed diam nonumy eirmod tempor
invidunt ut labore et dolore
magna aliquyam erat, sed diam
voluptua. - At vero eos et accu-
sam et justo duo dolores et ea
rebum. - Stet clita kasd guber-
gren, no sea takimata sanctus
est Lorem ipsum dolor sit amet.
Run Code Online (Sandbox Code Playgroud)

如何在命令行上将其打印为连续文本,但删除行尾的音节划分:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. - At vero eos et accusam et justo duo dolores et ea rebum. - Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Run Code Online (Sandbox Code Playgroud)

我可以tr '\n' ' '用来将换行符转换为空格

问题是tr只能替换一个字符,我需要一些命令来-\n提前删除。我怎样才能在 bash 命令行上实现这一点?

αғs*_*нιη 5

使用awk

awk -F'-$' '{ printf "%s", sep $1; sep=/-$/?"":OFS } END{ print "" }' infile
Run Code Online (Sandbox Code Playgroud)

-F'-$',我们定义了˚F ield小号eparator在一行的末尾到单个连字符,所以与此和通过取第一场$1中,我们将始终具有线而没有连字符具有该连字符或静止整条生产线的那些那些线没有那个连字符。

那么我们就简单地用它打印sep之间但改变读出下一行时,空字符串,如果当前行用连字符,否则结局OFS(Ø本安输出˚F ield小号eparator,默认为空格字符)。

END{...}块中,我们添加了最后一个换行符以使其成为POSIX 文本文件,如果您不想添加它,只需删除该部分。


使用sed,或者:

sed ':loop /-$/N;s/-\n//;t loop; N;s/\n/ /;t loop' infile
Run Code Online (Sandbox Code Playgroud)
  • :环形
    • 如果一行以连字符结尾(用 测试/-$/),请阅读N分行并将“连字符+ \newline”替换为空字符串。
      如果替换成功(使用 测试t),则跳转到标签循环并处理下一行并跳过执行其余代码。
    • 否则,阅读N分行并用\n空格字符替换这两行之间嵌入的ewline。
      如果此处的替换也成功,则跳转到标签循环并处理下一行。