如何在 Bash shell 中使用 GNU sed 只获取带有单引号的行?

How to get only lines with a single quote using GNU sed in Bash shell?

我正在编写一个脚本来解析一个文本文件(多行)。我只需要打印符合以下模式的行:

  1. 该行的第一个字符是大写字母
  2. 该行的第二个字符是小写字母或单引号
  3. 该行的第三个字符是小写字母或 space

"valid" 行的例子

尝试在 Linux

上使用 GNU sed 4.2.2

I ] 第一次尝试(逃跑)

$ html2text foo.html | sed -r "/^([A-Z][a-z\'])/!d"

产生以下错误消息:

html2text foo.html | sed -r "/^([A-Z][a-z\'])/date"

sed: -e expression n°1, character 19: extra characters after command

II ] 第二次尝试(没有转义)

$ html2text foo.html | sed -r "/^([A-Z][a-z'])/!d"

产生以下错误消息:

html2text foo.html | sed -r "/^([A-Z][a-z'])/date"

sed: -e expression n°1, character 18: extra characters after command

我不太确定如何处理范围内的单引号“'”。我知道根本不支持在单引号 sed 表达式中转义单引号,但这里两个 sed 表达式都是双引号。

奇怪的是错误消息 return ".../date"(错误消息的第一行)似乎是错误或解析问题("/!d" 标志被误解) ...

注意:html2text 将 'foo.html' 转换为文本文件。 sed -r 选项代表扩展正则表达式。 "[A-Z]" 匹配一个字符范围(方括号在这里不是文字)

感谢您的帮助

正如 casimir-et-hippolyte 所指出的,这里使用 grep 更简单:

grep "^[A-Z][a-z'][a-z ]"

或使用 sed:

sed -n "/^[A-Z][a-z'][a-z ]/p"

如果您出于某种原因需要使用单引号,这可以用来转义脚本中的单引号

sed -n '/^[A-Z][a-z'"'"'][a-z ]/p'