文字列の 2 つの単語間のすべてを含む文字列を出力しようとしています。
入力:
"Here is a String"
出力:
"is a"
使用:
sed -n '/Here/,/String/p'
エンドポイントが含まれていますが、それらを含めたくありません。
GNU grep は、肯定的および否定的な先読みと振り返りもサポートできます。あなたの場合、コマンドは次のようになります。
echo "Here is a string" | grep -o -P '(?<=Here).*(?=string)'
Here
とが複数出現する場合は、最初と最後string
から照合するか、個別に照合するかを選択できます。正規表現に関しては、貪欲な一致 (最初のケース)または非貪欲な一致 (2 番目のケース)と呼ばれます。Here
string
$ 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
sed -e 's/Here\(.*\)String/\1/'
Here
受け入れられた回答は、 の前後にある可能性のあるテキストを削除しませんString
。この意志:
sed -e 's/.*Here\(.*\)String.*/\1/'
主な違いは、.*
直前Here
と直後の追加ですString
。
多くの複数行のオカレンスを含む長いファイルがある場合は、最初に number 行を出力すると便利です。
cat -n file | sed -n '/Here/,/String/p'
これはあなたのために働くかもしれません(GNU sed):
sed '/Here/!d;s//&\n/;s/.*\n//;:a;/String/bb;$!{n;ba};:b;s//\n&/;P;D' file
これにより、改行上の2つのマーカー(この場合はHere
とString
)の間のテキストの各表現が表示され、テキスト内の改行が保持されます。
上記のすべてのソリューションには、最後の検索文字列が文字列内の他の場所で繰り返されるという欠陥があります。私は、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"
使用できます\1
( http://www.grymoire.com/Unix/Sed.html#uh-4を参照):
echo "Hello is a String" | sed 's/Hello\(.*\)String/\1/g'
括弧内の内容は として保存され\1
ます。