unix bash-从文件中提取一行
需要你的帮助!!!我试着找这个,但没用 如何使用bash实现以下功能 我有一个名为“cube.mdl”的平面文件,其中包含:unix bash-从文件中提取一行,bash,unix,scripting,awk,grep,Bash,Unix,Scripting,Awk,Grep,需要你的帮助!!!我试着找这个,但没用 如何使用bash实现以下功能 我有一个名为“cube.mdl”的平面文件,其中包含: [...] bla bla bla bla lots of lines above Cube 8007841 "BILA_" MdcFile "BILA_CO_PM_MKT_BR_CUBE.mdc" bla bla bla more lines below [...] 我需要打开该文件,查找单词“MdcFile”,并获取引号之间的字符串,即BILA\u CO\u PM\
[...]
bla bla bla bla lots of lines above
Cube 8007841 "BILA_" MdcFile "BILA_CO_PM_MKT_BR_CUBE.mdc"
bla bla bla more lines below
[...]
我需要打开该文件,查找单词“MdcFile”,并获取引号之间的字符串,即BILA\u CO\u PM\u MKT\u BR\u CUBE.mdc
我知道AWK或grep的强大功能足以在一行中完成这项工作,但我找不到一个例子可以帮助我自己完成这项工作
提前谢谢!
吉玛
假设这些位中没有空格来抛出位置计数,就可以这样做。这样就可以了
sed -n '/MdcFile / s/.*MdcFile "\(\[^"\]\+\)".*/\1/;/MdcFile / p' INPUTFILE
您可以使用:
grep -o -P "MdcFile.*" cube.mdl | awk -F\" '{ print $2 }'
这将使用grep
的正则表达式仅返回当前行中的MdcFile
及其后的所有内容。然后,awk
将使用“
作为分隔符,并仅打印第二个单词,即您的“带引号”单词,当然返回时不带引号
选项-o
,--only matching
指定只返回匹配的文本匹配,-p
,--perl regexp
指定该模式为perl Regex模式。grep的某些版本似乎不包含这些选项。OP的版本不包含这些选项,但以下内容似乎适合他:
grep "MdcFile.*" cube.mdl | awk -F\" '{ print $2 }'
使用
awk
作为整个事件的记录分隔符“
:
awk -v RS='"' '/MdcFile/ { getline; print }' cube.mdl
这也会打印出
“
s。还有一个不必要的过程…(awk'/MdcFile/{print$5}
)。非常感谢Marc,这是真的,它在输出中包含了引号。Zsolt Botykai,我如何实现你的建议?有点像是将它与Marc发布的内容相结合。它不起作用(我测试了它)。首先,替换命令在末尾留下一条斜线,没有匹配的第一组(\1
)。第二,方括号不需要转义。第三,打印命令(p
)始终执行,因此也会打印不匹配的行。MdcFile
。类似这样的内容更准确:sed-ne'/MdcFile/{s/^.*MdcFile[^“]*”\([^“]*\)”/\1/;p;}infle
hey Birei,首先,谢谢你。你的建议几乎奏效了,它正确地提取了引号中的单词"但它也提取了下面这行的第一个单词。它有点不识别分线或类似的东西。谢谢你的输入,我尝试过,但似乎这个unix不喜欢它。我得到了:grep:unclark option--o grep:unclark option--P谢谢你,伙计,看,我删除了-o和-P参数,得到了正确的结果T OUTPUT!:D那些-o-P参数是必须的吗?请解释。@jmaltube-Hah;显然,在您的情况下,不是这样。-o
指定只返回匹配的文本,-P
指定使用Perl的正则表达式引擎。在我的版本中,它们是必需的-如果没有它们,则会失败。我正在运行GNU Grep 2.6.3
,如果这很重要,但如果您的版本正常工作,那么默认情况下,您的版本必须与这样的模式匹配。
awk -v RS='"' '/MdcFile/ { getline; print }' cube.mdl