【发布时间】:2011-12-12 10:40:44
【问题描述】:
比如说,下面的命令: 少一些文件名 | grep -w 'some_text' 给出以下输出:
some_text = 'x.y.z';
例如,像 1.12.5 这样的 x、y、z 数字,我如何将输出剥离为
x.y.z ?
应该可以使用一些正则表达式或 sed/awk 左右,但无法弄清楚。
【问题讨论】:
比如说,下面的命令: 少一些文件名 | grep -w 'some_text' 给出以下输出:
some_text = 'x.y.z';
例如,像 1.12.5 这样的 x、y、z 数字,我如何将输出剥离为
x.y.z ?
应该可以使用一些正则表达式或 sed/awk 左右,但无法弄清楚。
【问题讨论】:
echo " some_text = '12.3.012';" | sed -r "s/[^']+'([.0-9]+)'\s*;/\1/"
【讨论】:
我发现在使用grep 时,cut 是我的朋友。您可以剪切字符或字段。在这种情况下,您需要类似:
echo "some_text = 'x.y.z'" | cut -d\' -f2
-d 参数指定分隔符(此处转义),-f 指定字段编号(从 1 开始)。
如果您的数据可能位于不同的字段中,那么您必须想出一个与您想要的部分匹配的正则表达式。喜欢
cat file | grep -o x\.y\.z
-o 到 grep 表示只返回匹配的部分。
【讨论】:
通过 awk:
kent$ echo "some_text = 'x.y.z';"|awk -F"'" '{print $2}'
x.y.z
实际上你也可以在你的 grep 行上做一些事情。例如
less somefile | grep -Po "(?<=some_text = ')[^']*(?=')"
【讨论】:
这将同时进行行匹配和内容提取:
awk -F"'" '/some_text/{print $2}' some_filename
例如:
[me@home]$ cat some_filename
random data
some_text = 'x.y.z';
another_text = '1.2.3.4';
[me@home]$ awk -F"'" '/some_text/{print $2}' some_filename
x.y.z
awk 命令的简要说明:
-F"'" :将字段分隔符更改为'。这将有效地将“some_text = 'x.y.z'”之类的字符串拆分为 3 个字段 - “some_text =”、“x.y.x”和“;”/some_text/ :仅匹配包含“some_text”的行{print $2} :对于每个匹配行,打印第二个字段(在本例中为“x.y.z”)【讨论】:
同Prince John Wesley solution,只是加号搜索some_text。
sed -n "/some_text/ s@.*'\([^']*\)'.*@\1@p"
【讨论】: