通过在行中向后移动来打印两个字符之间的单词

时间:2012-05-31 00:28:44

标签: bash sed awk

我在从一行中提取单词时遇到问题。我想要的是它选择符号#之前的第一个单词但是在/之后。哪个是唯一脱颖而出的分隔符​​。

一行如下:

,["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="[$#]"

3 个答案:

答案 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.+(?=#)"

使用cutawk获取第一个字段(拆分#)后跟最后一个字段(拆分/):

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