web-dev-qa-db-ja.com

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

入力:

blahŤfoobar1Ťblah

望ましい出力:

foobar1

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

物事を簡単にするために、常に0または2つの「Ť」文字があると仮定します。

私は以下を試しましたが、どの発生であるかを知る方法がわかりません:

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

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

sedを使用する

echo "blahŤfoobar1Ťblah" | sed  -r 's/(^.*Ť)(.*)(Ť.*$)/\2/'

出力

foobar1

sedを使用する別の可能な方法

echo "blahŤfoobar1Ťblah" | sed -r 's/.*Ť(.*)Ť.*/\1/' 

出力

foobar1

-r noteの@kosに感謝

2
Maythux

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
Ť
2
fedorqui

awkがこの問題に最も使いやすいようです:

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

Perlを使用してテキストを抽出することもできます。

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

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

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

$ echo "blahŤfoobar1Ťblah" | Perl -pe 's/.*Ť(.*)Ť.*/$1/' 
foobar1
1
Sylvain Pineau
  1. bashを使用:

    _$ test='blahŤfoobar1Ťblah'
    $ spamegg="${test#*Ť}"
    $ echo "${spamegg%Ť*}"
    foobar1
    _

    ここでは、bashパラメーター展開を使用して、必要なサブストリングを取得しました。

    • _"${test#*Ť}"_は_blahŤ_の部分を削除するため、変数spameggには_foobar1Ťblah_が含まれます。

    • _${spamegg%Ť*}_は末尾の_Ťblah_を削除するので、出力_foobar1_を取得します

  2. grepを使用:

    _    $ echo "blahŤfoobar1Ťblah" | grep -Po '(?<=Ť)[^Ť]+(?=Ť)'
        foobar1
    _
    • _-P_はPerl互換の正規表現を実装し、_-o_は一致した部分のみを出力します

    • _(?<=Ť)_は、一致する前に_Ť_が存在することを保証するパターンの後ろの幅ゼロのポジティブルックです。

    • _(?=Ť)_は、一致後に_Ť_が存在することを保証する幅ゼロの正の先読みパターンです。

    • _[^Ť]+_は、2つの_Ť_文字の間の1つ以上の文字に一致します。

  3. pythonを使用:

    _$ python2 -c "print 'blahŤfoobar1Ťblah'.split('Ť')[1]"
    foobar1
    _
    • split()は、文字列を_Ť_で区切られたフィールドのリストに分割し、リストの2番目の要素を出力します。
1
heemayl