同じ文字のペア間のテキストを抽出するにはどうすればよいですか?

同じ文字のペア間のテキストを抽出するにはどうすればよいですか?

入力:

blahŤfoobar1Ťblah

望ましい出力:

foobar1

2 つの「Ť」文字の間のテキストを取得したいです。

簡単にするために、常に 0 個または 2 個の「Ť」文字があると想定します。

次のことを試しましたが、どの発生であるかを判別する方法がわかりません。

echo "blahŤfoobar1Ťblah" | sed -n '/Ť/,/Ť/p'

答え1

カットコマンドを使用できます。

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'}

答え2

awkこの問題にはこれが最も簡単に使えるようです:

$ echo "blahŤfoobar1Ťblah" | awk -FŤ '{ print $2 }'
foobar1

答え3

awkこういうものが好きです:

$ awk -F"Ť" '{print $2}' <<< "blahŤfoobar1Ťblah"
foobar1

フィールド区切り文字としてを使用することでŤ、2 番目のブロックで目的のテキストを確実にキャッチできるようになります。特定の行に が見つからない場合に処理をスキップしたい場合はŤ、 を使用できますawk -F"Ť" 'NF>1{print $2}'


動作しない試みに関して:を含む行と を含む別のsed -n '/start/,/end/p'行の間にある (および を含む) 行を印刷しているとします。したがって、これが必要な場合は動作します。startend

次のファイルがあるとします:

$ cat a
starting...
Ť
foobar1
hello
Ť
i am here

出力は次のようになります。

$ sed -n '/Ť/,/Ť/p' a
Ť
foobar1
hello
Ť

答え4

perlテキストを抽出するためにも使用できます:

$ echo 'blahŤfoobar1Ťblah' | perl -FŤ -ane 'print"$F[1]\n"'
foobar1

-Fここで重要なのは、区切り文字を設定するオプションを使用することです。

正規表現を使用する別のアプローチ:

$ echo "blahŤfoobar1Ťblah" | perl -pe 's/.*Ť(.*)Ť.*/$1/' 
foobar1

関連情報