一致する2つの単語間のすべての単語を抽出する

一致する2つの単語間のすべての単語を抽出する

次の行があり、その間にすべての単語が必要です。選ぶそして完璧

 vertical on; select blah blah blah contains all special characters including /*?&;  Done

答え1

bash正規表現を使用すると、次のようになります(変数に行があると仮定)。

$ line="vertical on; select blah blah blah contains all special characters including /*?&;  Done"
$ [[ "$line" =~ select(.*)Done ]] && echo ${BASH_REMATCH[1]}
blah blah blah contains all special characters including /*?&;

答え2

この試み、

 sed -e 's/.*select//;s/Done.*//'

答え3

努力する

sed -e 's/select\(.*\)Done/\1/'

答え4

Perl互換正規表現(PCRE)を使用してください。

(?<=word1).*?(?=word2)

上記のパターンをGNUに適用しますgrep

$ grep -Po '(?<=select).*?(?=Done)' <<< ' vertical on; select blah blah blah contains all special characters including /*?&;  Done'
 blah blah blah contains all special characters including /*?&;  

説明する

  • (?<=word1): マッチword1 今後現在地を検索しますが、結果には含まれません。
  • .*?:すべての文字列と一致します。
  • (?=word2): マッチword2 後ろに現在地を検索しますが、結果には含まれません。

(?<=word1)モードを(?=word2)総称して周りを見てください。 POSIXエンジン(BREおよびERE)はこの機能をサポートしていないため、より強力なエンジン(PCREなど)が必要です。

関連情報