Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
unix bash-从文件中提取一行_Bash_Unix_Scripting_Awk_Grep - Fatal编程技术网

unix bash-从文件中提取一行

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\

需要你的帮助!!!我试着找这个,但没用

如何使用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\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