与えられた区切り文字の間のn番目の部分文字列を特定する方法は?

与えられた区切り文字の間のn番目の部分文字列を特定する方法は?

区切り文字に次の文字列があるとします?

Leslie Cheung April 1 ? Elvis August 16 ? Leonard Nimoy February 27

grep文字間の最初の部分文字列を区切る方法を知っています。

echo $above_string | grep -oP "^[^?]*"
Leslie Cheung April 1

2番目または3番目の部分文字列をgrepするには、正規表現をどのように変更する必要がありますか?

答え1

せん断を使うのはどうですか? 2番目のパターンを印刷するには

echo "$above_string" | cut -f2 -d "?"

2列目以降

echo "$above_string" | cut -f2- -d "?"

答え2

echo $above_string | grep -oP "^([^?]*\?){2}\K[^?]*"

n番目の文字列を取得するには、値を2変更します。n - 1

これはn番目の文字列が必要であると仮定します。その行に。リテラル "?"(perl正規表現の特殊文字であるため)?で終わらないn - 1個の文字列があります。\?次に、\K前のコンテンツに興味がないと宣言するので、次の区切り文字まで次のテキストのみを抽出します。

答え3

awkを使用して、改行で区切られた2番目と3番目のレコードを印刷します。

awk -F"?" '{printf "%s\n%s\n", $2,$3}'
Elvis August 16 
Leonard Nimoy February 27

レコードを置き換えるには変数に設定できます。

awk -v record=2 -F"?" '{print $record}'
Elvis August 16 

答え4

sed

これを達成するためにsedを使用できますが、お勧めできません。たとえば、次は、数量子を使用して必須フィールドを選択する最初からのソリューションです。

n=1
sed 's/\([^?]*? *\)\{'$n'\}//; s/?.*//' <<<"$above_string"

出力:

Elvis August 16 

関連情報