176

文字列の 2 つの単語間のすべてを含む文字列を出力しようとしています。

入力:

"Here is a String"

出力:

"is a"

使用:

sed -n '/Here/,/String/p'

エンドポイントが含まれていますが、それらを含めたくありません。

4

12 に答える 12

211

GNU grep は、肯定的および否定的な先読みと振り返りもサポートできます。あなたの場合、コマンドは次のようになります。

echo "Here is a string" | grep -o -P '(?<=Here).*(?=string)'

Hereとが複数出現する場合は、最初と最後stringから照合するか、個別に照合するかを選択できます。正規表現に関しては、貪欲な一致 (最初のケース)または非貪欲な一致 (2 番目のケース)と呼ばれます。Herestring

$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*(?=string)' # Greedy match
 is a string, and Here is another 
$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*?(?=string)' # Non-greedy match (Notice the '?' after '*' in .*)
 is a 
 is another 
于 2012-11-06T06:58:37.127 に答える
140
sed -e 's/Here\(.*\)String/\1/'
于 2012-11-06T00:14:09.013 に答える
84

Here受け入れられた回答は、 の前後にある可能性のあるテキストを削除しませんString。この意志:

sed -e 's/.*Here\(.*\)String.*/\1/'

主な違いは、.*直前Hereと直後の追加ですString

于 2017-05-05T03:23:40.253 に答える
46

Bashだけで文字列を削除できます。

$ foo="Here is a String"
$ foo=${foo##*Here }
$ echo "$foo"
is a String
$ foo=${foo%% String*}
$ echo "$foo"
is a
$

また、 PCREを含む GNU grep がある場合は、ゼロ幅アサーションを使用できます。

$ echo "Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a
于 2012-11-06T00:19:51.023 に答える
26

多くの複数行のオカレンスを含む長いファイルがある場合は、最初に number 行を出力すると便利です。

cat -n file | sed -n '/Here/,/String/p'
于 2013-06-08T13:11:26.737 に答える
9

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

sed '/Here/!d;s//&\n/;s/.*\n//;:a;/String/bb;$!{n;ba};:b;s//\n&/;P;D' file 

これにより、改行上の2つのマーカー(この場合はHereString)の間のテキストの各表現が表示され、テキスト内の改行が保持されます。

于 2012-11-06T00:42:57.703 に答える
8

上記のすべてのソリューションには、最後の検索文字列が文字列内の他の場所で繰り返されるという欠陥があります。私は、bash 関数を作成するのが最善であることを発見しました。

    function str_str {
      local str
      str="${1#*${2}}"
      str="${str%%$3*}"
      echo -n "$str"
    }

    # test it ...
    mystr="this is a string"
    str_str "$mystr" "this " " string"
于 2015-06-17T04:45:57.377 に答える
4

使用できます\1( http://www.grymoire.com/Unix/Sed.html#uh-4を参照):

echo "Hello is a String" | sed 's/Hello\(.*\)String/\1/g'

括弧内の内容は として保存され\1ます。

于 2012-11-06T00:19:40.613 に答える