0

行から単語を抽出するのに問題があります。私が欲しいのは、記号#の前で/の後の最初の単語を選択することです。目立つ唯一の区切り文字です。

行は次のようになります。

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

3 に答える 3

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)関心のあるキャプチャされたテキストだけに置き換えられます。

于 2012-05-31T00:39:10.007 に答える
1

grep一部のPerl正規表現拡張機能での使用:

echo $string | grep -P -o "(?<=/)[^/]+(?=#)"

-PgrepPerl拡張機能を使用するように指示します。一致したテキストのみを表示するように-o指示します。何が一致するかを理解するには、正規表現を、、、およびgrepの3つの部分に分割(?<=/)します。最初の部分は、一致するテキストは、一致に「/」を含めずに「/」の後に続く必要があることを示しています。2番目の部分は、「/」以外の文字の文字列と一致します。最後の部分は、一致したテキストの直後に「#」を付ける必要があり、一致に「#」を含めないことを示しています。[^/]+?(?=#)

別の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
于 2012-05-31T01:00:19.830 に答える
0

これはあなたのために働くかもしれません:

sed '/.*\/\([^#]*\)#.*/{s//\1/;q};d' file
于 2012-05-31T06:12:04.643 に答える