我正在尝试解析一个多行句子:
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