1

我想从unix中的字符串中提取模式之前的单词。我怎样才能做到这一点?

例如:假设字符串中的字符串是“sv_z = sample.scr”,我必须搜索“.scr”。如果在字符串中找到,我必须提取整个单词。在此示例中,输出应为 sample.scr。到达单词的分隔符可以是空格、双引号或等于。

这里还有几个例子:

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

这是我的预期输出:

sample.scr
sample.scr
sample.scr
4

3 回答 3

2

这是一种使用方法grep

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

解释:

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

编辑:

或者,如果您需要更严格的要求,则需要 Perl-regex 和积极的前瞻。在下面的示例中,这将确保匹配后跟双引号、空格或行尾。此外,您可以将星号 ( *) 更改为加号 ( +),表示匹配一次或多次。因此,这将过滤掉以下内容:.scr. 但是从您的示例输入中并不清楚您在此处寻找的确切内容。祝你好运。

grep -oP '[^ "=]*\.scr(?=("| |$))' file
于 2012-11-29T12:13:29.160 回答
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 输出中可能不需要的最后两行。

于 2012-11-29T18:24:02.147 回答
0

另一种解决方案:

 awk -F= 'NR==1{print $2}{FS="\""}NR>1{print $2}' file
于 2012-11-29T21:41:37.057 回答