查找两个特定字符或字符串之间的文本

Ame*_*ina 17 text-processing regular-expression

说我有这样的行:

*[234]*
*[23]*
*[1453]*
Run Code Online (Sandbox Code Playgroud)

where*代表任何字符串(除了形式为 的字符串[number])。如何使用命令行实用程序解析这些行并提取括号之间的数字?

更一般地,它的这些工具cutsedgrepawk将适合这样的任务?

Gil*_*il' 16

如果您有 GNU grep,您可以使用它的-o选项来搜索正则表达式并仅输出匹配的部分。(其他 grep 实现只能显示整行。)如果一行中有多个匹配项,则将它们打印在单独的行上。

grep -o '\[[0-9]*\]'
Run Code Online (Sandbox Code Playgroud)

如果你只想要数字而不是括号,那就有点难了;您需要使用零宽度断言:与空字符串匹配的正则表达式,但前提是它前面或后面(视情况而定)有一个括号。零宽度断言仅在 Perl 语法中可用。

grep -P -o '(?<=\[)[0-9]*(?=\])'
Run Code Online (Sandbox Code Playgroud)

使用sed,需要关闭打印-n,匹配整行,只保留匹配部分。如果一行中有多个可能的匹配项,则只打印最后一个匹配项。有关在此处使用 sed 的更多详细信息,请参阅提取与 'sed' 匹配的正则表达式而不打印周围的字符

sed -n 's/^.*\(\[[0-9]*\]\).*/\1/p'
Run Code Online (Sandbox Code Playgroud)

或者如果你只想要数字而不是括号:

sed -n 's/^.*\[\([0-9]*\)\].*/\1/p'
Run Code Online (Sandbox Code Playgroud)

如果没有grep -o,Perl 是这里的首选工具,如果您想要既简单又易于理解的东西。在每一行 ( -n) 上,如果该行包含 的匹配项\[[0-9]*\],则打印该匹配项 ( $&) 和换行符 ( -l)。

perl -l -ne '/\[[0-9]*\]/ and print $&'
Run Code Online (Sandbox Code Playgroud)

如果您只需要数字,请将括号放在正则表达式中以分隔组,并仅打印该组。

perl -l -ne '/\[([0-9]*)\]/ and print $1'
Run Code Online (Sandbox Code Playgroud)

PS 如果您只想在括号之间输入一位或多位数字,请在 Perl 中更改[0-9]*[0-9][0-9]*[0-9]+


Kyl*_*nes 5

你不能用cut.

  1. tr -c -d '0123456789\012'
  2. sed 's/[^0-9]*//g'
  3. awk -F'[^0-9]+' '{ print $1$2$3 }'
  4. grep -o -E '[0-9]+'

tr 是最适合该问题的方法,并且可能运行得最快,但我认为您需要大量输入才能在速度方面将这些选项中的任何一个分开。