入力:
blahŤfoobar1Ťblah
望ましい出力:
foobar1
2つの「Ť」文字の間のテキストを取得したい。
物事を簡単にするために、常に0または2つの「Ť」文字があると仮定します。
私は以下を試しましたが、どの発生であるかを知る方法がわかりません:
echo "blahŤfoobar1Ťblah" | sed -n '/Ť/,/Ť/p'
Cutコマンドを使用できます。
2番目のパターンを抽出するには:
echo "blah@foobar1@blah" | cut -f2 -d"@"
2番目と3番目のパターンを抽出するには:
echo "blah@foobar1@blah" | cut -f2,3 -d"@"
2番目のパターンから先に抽出するには
echo "blah@foobar1@blah" | cut -f2- -d"@"
編集:質問にawkのタグが付けられたため。これがawkソリューションです。
echo "blah@foobar1@blah" | awk -F'@' {'print $2'}
sed
を使用する
echo "blahŤfoobar1Ťblah" | sed -r 's/(^.*Ť)(.*)(Ť.*$)/\2/'
出力
foobar1
sed
を使用する別の可能な方法
echo "blahŤfoobar1Ťblah" | sed -r 's/.*Ť(.*)Ť.*/\1/'
出力
foobar1
-r
noteの@kosに感謝
awk
は次のことが好きです:
$ awk -F"Ť" '{print $2}' <<< "blahŤfoobar1Ťblah"
foobar1
Ť
をフィールド区切り文字として使用することにより、2番目のブロックで目的のテキストを確実にキャッチできます。特定の行にŤ
が見つからない場合に処理をスキップする場合は、awk -F"Ť" 'NF>1{print $2}'
を使用できます。
動作しないという試みについて:sed -n '/start/,/end/p'
と言うことで、start
を含む行とend
を含む行の間にある(そして含まれる)行を印刷します。したがって、これが必要な場合は機能します。
このファイルが与えられた場合:
$ cat a
starting...
Ť
foobar1
hello
Ť
i am here
出力は次のとおりです。
$ sed -n '/Ť/,/Ť/p' a
Ť
foobar1
hello
Ť
awk
がこの問題に最も使いやすいようです:
$ echo "blahŤfoobar1Ťblah" | awk -FŤ '{ print $2 }'
foobar1
Perl
を使用してテキストを抽出することもできます。
$ echo 'blahŤfoobar1Ťblah' | Perl -FŤ -ane 'print"$F[1]\n"'
foobar1
ここで重要なのは、-F
オプションで区切り文字を設定します。
正規表現を使用する別のアプローチ:
$ echo "blahŤfoobar1Ťblah" | Perl -pe 's/.*Ť(.*)Ť.*/$1/'
foobar1
bash
を使用:
_$ test='blahŤfoobar1Ťblah'
$ spamegg="${test#*Ť}"
$ echo "${spamegg%Ť*}"
foobar1
_
ここでは、bash
パラメーター展開を使用して、必要なサブストリングを取得しました。
_"${test#*Ť}"
_は_blahŤ
_の部分を削除するため、変数spamegg
には_foobar1Ťblah
_が含まれます。
_${spamegg%Ť*}
_は末尾の_Ťblah
_を削除するので、出力_foobar1
_を取得します
grep
を使用:
_ $ echo "blahŤfoobar1Ťblah" | grep -Po '(?<=Ť)[^Ť]+(?=Ť)'
foobar1
_
_-P
_はPerl
互換の正規表現を実装し、_-o
_は一致した部分のみを出力します
_(?<=Ť)
_は、一致する前に_Ť
_が存在することを保証するパターンの後ろの幅ゼロのポジティブルックです。
_(?=Ť)
_は、一致後に_Ť
_が存在することを保証する幅ゼロの正の先読みパターンです。
_[^Ť]+
_は、2つの_Ť
_文字の間の1つ以上の文字に一致します。
python
を使用:
_$ python2 -c "print 'blahŤfoobar1Ťblah'.split('Ť')[1]"
foobar1
_
split()
は、文字列を_Ť
_で区切られたフィールドのリストに分割し、リストの2番目の要素を出力します。