我想从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
答案 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