我在从一行中提取单词时遇到问题。我想要的是它选择符号#之前的第一个单词但是在/之后。哪个是唯一脱颖而出的分隔符。
一行如下:
,["https://picasaweb.google.com/111560558537332305125/Programming#5743548966953176786",1,["https://lh6.googleusercontent.com/-Is8rb8G1sb8/T7UvWtVOTtI/AAAAAAAAG68/Cht3FzfHXNc/s0-d/Geek.jpg",1920,1200]
我想要Programming
这个词。
为了得到那条线,我正在使用它来缩小它。
sed -n '/.*picasa.*.jpg/p' 5743548866439293105
所以我希望它几乎找到#
然后向后移动直到它到达第一个/
。然后打印出来。在这种情况下,单词应为Programming
,但可以是任何内容。
我希望它尽可能短,并尝试使用
sed -n '/.*picasa.*.jpg/p' 5743548866439293105 | awk '$0=$2' FS="/" RS="[$#]"
答案 0 :(得分:1)
您可以使用sed
执行此操作(格式略微缩短,但也适用于原始字符串):
pax> echo ',["https://p.g.com/111/Prog#574' | sed 's/^[^#]*\/\([^#]*\)#.*$/\1/'
Prog
pax>
更详细地解释:
/---+------------------> greedy capture up to '/'.
/ |
| | /------+---------> capture the stuff between '/' and '#'.
| |/ |
| || | /-+-----> everything from '#' to end of line.
| || |/ |
| || || |
's/^[^#]*\/\([^#]*\)#.*$/\1/'
||
\+---> replace with captured group.
它基本上搜索具有您想要的模式的整行(#
后面的/
},同时捕获(使用\(
和\)
括号)只是/
和#
之间的内容。
替换然后用您感兴趣的捕获文本替换整行(通过\1
)。
答案 1 :(得分:1)
将grep
与一些Perl正则表达式扩展名一起使用:
echo $string | grep -P -o "(?<=/)[^/]+(?=#)"
-P
告诉grep
使用Perl扩展。 -o
告诉grep
仅显示匹配的文字。要了解匹配的内容,请将正则表达式分为三个部分:(?<=/)
,[^/]+?
和(?=#)
。第一部分说匹配的文本必须跟随'/',而不包括匹配中的'/'。第二部分匹配一串非'/'字符。最后一部分说匹配的文本必须紧跟一个'#',而不包括匹配中的'#'。
另一个grep,使用“\ K”功能将比赛“扔掉”到'#'之前的最后一个'/':
# Match as much as possible up to a '/', but throw it away, then match as much as you can
# up to the first #
echo $string | grep -oP ".*/\K.+(?=#)"
使用cut
和awk
获取第一个字段(拆分#)后跟最后一个字段(拆分/):
echo $string | cut -d# -f1 | awk -F/ '{print $NF}'
使用一些临时变量和bash的参数扩展功能:
$ FOO=["https://picasaweb.google.com/111560558537332305125/Programming#5743548966953176786",1,["https://lh6.googleusercontent.com/-Is8rb8G1sb8/T7UvWtVOTtI/AAAAAAAAG68/Cht3FzfHXNc/s0-d/Geek.jpg",1920,1200]
$ BAR=${FOO%#*} # Strip the last # and everything after
$ echo $BAR
[https://picasaweb.google.com/111560558537332305125/Programming
$ BAZ=${BAR##*/} # Strip everything up to and including the last /
$ echo $BAZ
Programming
答案 2 :(得分:0)
这可能对您有用:
sed '/.*\/\([^#]*\)#.*/{s//\1/;q};d' file