修剪换行符 \n 和多余空格的 Bash 替代方法

修剪换行符 \n 和多余空格的 Bash 替代方法

我正在尝试解析一个多行句子:

You have to go tomorrow by
                                        car.

正如您所看到的,在“car”后面有一个新行 + 空格。

我使用了这个正则表达式:

You.have.to.go.tomorrow.by.\n.+

当我使用它时,效果很好regex101但是当我在 bash 中使用它时,它只对第一句话起作用:

Parser='You.have.to.go.tomorrow.by.\n.+'

结果:

You have to go tomorrow by

我正在使用 bash,我想要完整的句子:

"You have to go tomorrow by car."

我在用:

sed -e 's/<[^>]\+>/ /g' | grep -oP $parser

删除所有 HTML 标签,然后使用 grep 进行解析。

答案1

-z, --null-data使用 NUL 字符而不是换行符来分隔行,这使得匹配换行符成为可能。

grep -Pzo \
'You have to go tomorrow by\n\s+car.' text | tr -s '\n ' ' '

如果你在纯 bash 中执行此操作,你可能需要用 ANSI 引用你的模式来表示新队

#!/bin/bash

pattern=$'You have to go tomorrow by\n\s+car.'
[[ $(<text) \
=~ ($pattern) ]] && echo ${BASH_REMATCH}

假设你只想清理你引用的行,那么可以组合替换。匹配包含 '你必须在明天之前离开' 然后我们可以在这个匹配中用括号将多个命令分组并运行{...},并用分号分隔。

sed -rn '/You have to go tomorrow by/{N; s/\n//; s/ {2,}/ /; s/<[^>]+>//g;p}' text
  • N读取下一行并将其添加到模式空间。
  • s替代文本。
  • g全局,替换行中的所有出现的内容。
  • p打印。

答案2

tr

<FileName tr -s '\n' ' '

xargs

<FileName xargs

注意

FileName用包含两行的文件的名称进行更改。

  • <FileName将读取文件并输出到 STDIN...例如类似于cat FileName |

  • tr -s '\n' ' '将两行合并为一行并删除多个空格,只留下单个空格。

  • xargs默认情况下,它会修剪换行符和多余的空格,作为将来自 STDIN 的输入转换为命令参数的一部分......也就是说,这就是它完成工作的方式。

您还可以通过管道将输出传输到,sed如下tr所示:

<FileName sed -e 's/<[^>]\+>//g' | tr -s '\n' ' '

或者像sed这样xargs

<FileName sed -e 's/<[^>]\+>//g' | xargs

相关内容