我想知道是否可以使用 grep 命令来挑选出包含空格和换行符的字符串,例如:
Hello
I
am
here right now
我对正则表达式和一般使用命令行仍然很陌生(这是我学习这个的第二天),所以我的尝试是这样的:
grep H[\s\S]*w <filename>
我认为 [\s\S] 会给你任何字符,包括空格和换行符(与 . 不同),但它不起作用。
我在 Mac 操作系统上使用终端(不确定这是否有影响)。
答案1
grep
在线工作,所以,“你不能那样做”;但是,当我需要做类似的事情时bash
,我不想/不能使用perl
或类似的(或者,老实说,我只是想使用grep
)我做了这样的事情:
tr '\n' '\a' < <filename> | grep --only-matching Hello$'\a'I$'\a'am$'\a'here\ right\ now | tr '\a' '\n'
tr
翻译字符;在这里,你正在“翻译”新线路到贝尔 ASCII 字符 [十六进制代码 \x07 或 '\a'],然后对其进行处理grep
(请注意,grep
会看到一个很长的单行字符串,其中贝尔 ASCII 字符代替新队字符),然后回到“正常”,翻译贝尔 ASCII 字符到新队。
没有必要使用贝尔 ASCII 字符:您可以使用文件中未出现的任何字符;就我而言,只是我喜欢数字七,并且通常文本文件不包含任何贝尔 ASCII 字符
顺便说一句:$'\a'
是Bash ANSI-C 引用
答案2
尝试这个:
sed -e '1h;2,$H;$!d;g' -re 's/(.*)(H\w+\n)(.*w\n)(.*)/\2\3/' test.txt
test.txt 文件包含:
Something
Hello
I
am
here right now
Something else
测试用sed (GNU sed) 4.4
.您可以通过 Homebrew 在 macOS 上安装 GNU sed macOS 上的默认 sed 是 BSD sed,某些选项略有不同。
干杯,