
入力:
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'
行の間にある (および を含む) 行を印刷しているとします。したがって、これが必要な場合は動作します。start
end
例
次のファイルがあるとします:
$ 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