Bash 如何仅获取字符串的匹配部分?

Bash 如何仅获取字符串的匹配部分?,bash,Bash,我知道如何在bash中使用工具sed,而且grep也很好。但是对于输出,它们总是输出一行包含模式的内容 在bash中是否有方法剪切包含我想要的模式的特定字符串(使用regexp)?这就是为什么您有--help标志,grep--help: -o,--仅匹配仅显示线条匹配图案的一部分 现在你可以 $ echo 'hello world' | grep -o hello hello 使用sed: $ echo "hello world" | sed 's/.*\(hello\).*/\1/' 使用

我知道如何在
bash
中使用工具
sed
,而且
grep
也很好。但是对于输出,它们总是输出一行包含模式的内容


bash
中是否有方法剪切包含我想要的模式的特定字符串(使用
regexp
)?

这就是为什么您有
--help
标志,
grep--help

-o,--仅匹配仅显示线条匹配图案的一部分

现在你可以

$ echo 'hello world' | grep -o hello
hello
使用
sed

$ echo "hello world" | sed 's/.*\(hello\).*/\1/'

使用
GNU grep
可以使用
-o

-o仅打印匹配行中匹配的(非空)部分,每个部分在单独的输出行上

例如:

$ echo ab cd ef gh | grep a
ab cd ef gh
$ echo ab cd ef gh | grep -o a
a
通过sed

$ echo 'hello world' | sed 's/\(hello\)\|./\1/g'
hello

$ echo 'hello world' | sed -r 's/(hello)|./\1/g'
hello

grep-o
是您想要的。有没有办法使用
sed
来实现这一点?我只是好奇,不是为了某个特定的目标。
\1
会影响结果吗?我在
sed
手册页面中没有看到任何关于这方面的信息。@Chromium
\1
是第一组,即
hello
。这是一个正则表达式。那么命令
sed's/*\(hello\)./\1/'
的真正含义是什么呢?它并不意味着首先将
regexp
转换为组,对吗?