2012-11-29 86 views
1

我想从unix中的一个字符串中提取单词之前的单词。我该如何实现这一目标?从unix中的字符串中提取一个单词

如: 说字符串是这个字符串我要搜索“可控硅”在 “sv_z = sample.scr” 。如果字符串我必须提取整词中发现的。在这个例子中,输出应该是 sample.scr。达到这个词的分隔符可以是balnk空格,双引号或等于。

下面是一些例子:

sv_z=sample.scr 
sv_z=urhk_dbCall("sample.scr") 
sv_z="sample.scr" 

这里是我的预期输出:

sample.scr 
sample.scr 
sample.scr 

回答

2

下面是使用grep一个办法:

grep -o '[^ "=]*\.scr' file 

说明:

  • -o标志完全匹配模式。
  • [ ... ]是一个字符类。如果使用克拉(^)作为此类中的第一个字符,则它是类的否定,它实际上意味着“以下任何字符都不是”。
  • *表示匹配任何最后一个字符,零或任意次数。

编辑:

另外,如果你需要更严格,你需要Perl的正则表达式和positive lookahead。在下面的例子中,这将确保匹配之后是双引号,空格或行尾。此外,您可以将星号(*)更改为加号(+),表示匹配一次或多次。所以这会过滤出如下内容:.scr。但是,从您的示例输入您在此寻找的内容并不明确。祝你好运。

grep -oP '[^ "=]*\.scr(?=("| |$))' file 
+0

你需要逃脱 “”或者在“解读”中匹配“unscr”。如果OP不想自己匹配“.scr”,您也可能想将*更改为+。我也认为可能需要一些终止的RE(可能是'([“=] | $)''但是你需要以某种方式从打印的表达式中排除),所以它匹配”.scr“但不匹配”。拼字游戏“,但OP还没有真的告诉过我们。 –

+0

@EdMorton:谢谢埃德,那里的一些有效评论特别是逃避。以某种方式错过了。增加了一个更加严格的前瞻。 – Steve

0

在这个awk脚本我使用一个变量“d”包含允许的分隔符列表保存多次重复这些脚本:

$ cat file 
sv_z=sample.scr 
sv_z=urhk_dbCall("sample.scr") 
sv_z="sample.scr" 
sv_z="unscrambled" 
sv_z="sample.scrambled" 

$ awk -v d=' "=' 'match($0,"["d"][^"d"]+\.scr(["d"]|$)") { $0=substr($0,RSTART,RLENGTH); gsub("["d"]",""); print NR, $0 }' file 
1 sample.scr 
2 sample.scr 
3 sample.scr 

与发布grep的比较 - o解决方案:

$ grep -n -o '[^ "=]*.scr' file 
1:sample.scr 
2:sample.scr 
3:sample.scr 
4:unscr 
5:sample.scr 

注意那些最后2行,你可能不希望在grep输出中。

+0

此命令似乎工作。但在某些情况下,此命令仍然失败。例如 'exebatch mrbx4004 $ B2K_SESSION_ID scrFilename.scr $ ListFile4 $ OutputReport $ RipFile' 从上面的字符串我需要提取名称scrFilename.scr,似乎没有工作。请帮忙。 –

+0

适合我。是否有可能在字符串之前/之后的选项卡而不是空白或您的行结束于控制 - 女士或什么?我发布的代码将适用于您的发布要求。 –

+0

感谢您的回复。错误来自我身边。 但还有一件事,我需要提取所有与给定模式匹配的stringswhich,即使模式在同一行中不止一次。 例如在下面的代码中,我需要提取'ubixres.scr'和'CheckSact.scr'。这可能吗? 'sv_q = urhk_TBAF_SetKeyScript(“bafe3012.optionblk.key -f2 | ubixres.scr || CheckSact.scr”)' –

0

另一种解决方案:

awk -F= 'NR==1{print $2}{FS="\""}NR>1{print $2}' file 
相关问题