从unix中的字符串中提取单词

时间:2012-11-29 12:07:18

标签: unix sed awk

我想从unix中的字符串中提取模式之前的单词。我怎么能实现这个?

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

以下是一些例子:

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

这是我的预期输出:

sample.scr
sample.scr
sample.scr

3 个答案:

答案 0 :(得分:2)

这是使用grep的一种方式:

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

说明:

  • -o标志与模式完全匹配。
  • [ ... ]是一个角色类。如果一个克拉(^)被用作这个类中的第一个字符,它就是对该类的否定,它实际上意味着“没有以下字符”。
  • *表示匹配最后一个字符,零或任意次。

编辑:

或者,如果您需要更严格,则需要Perl-regex和positive lookahead。在下面的示例中,这将确保匹配后跟双引号,空格或行尾。此外,您可以将星标(*)更改为加号(+),这意味着匹配一次或多次。所以这会过滤掉像.scr这样的内容。但是,从您的示例输入中确切地您要查找的内容并不清楚。祝你好运。

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

答案 1 :(得分: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

注意grep输出中你可能不想要的最后两行。

答案 2 :(得分:0)

另一种解决方案:

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