2つの文字列間の文字列を一致させるBash正規表現

2つの文字列間の文字列を一致させるBash正規表現

私はnslookup -q=srv SOME_ADDRESS返されたアドレスを配列に使用して保存したいと思います。nslookup返品:

Server:   123.456.789.123
Address:  123.456.789.123#12

SOME_ADDRESS  service = 0 0 1234 address-1.i.want.
SOME_ADDRESS  service = 0 0 1234 address-2.i.want.
SOME_ADDRESS  service = 0 0 1234 address-3.i.want.

私はまだ正規表現を学んでおり、文字列を配列に入れます。

array=($(nslookup -q=srv SOME_ADDRESS | grep -o ' [a-z0-9.-]*[a-z0-9].$'))

これは私に空きスペースを与えます[ ]address-3.i.want.[ ]

adress-3.i.want.先頭または末尾にスペースがない場合、どのように一致させますか? (結果の文字列から文字を削除する代わりに正規表現を使用してください。他の文字列を追加またはgrepパイプcutする方法を知っていますが、正規表現を編集して目的の操作を実行できることを確認してください。)

答え1

GNUで操作を実行できます。sed

nslookup -q=srv "${SOME_ADDRESS}" | 
sed -n '/\.$/s///;T;/.* /s///p' | 
mapfile -t array

存在するsed

  • -nデフォルトでは、行は印刷されません。
  • /\.$/s///行末の「.」を削除します。
  • T最後に移動(上記の内容がない場合は何も印刷されないことを意味)
  • /.* /s///p印刷物が残るまですべて削除

または非GNU

sed -n '/ /s//\n/;/\n/D;s/\.$//p'
  • / /s//\n/n代わりにewlineを使用してください
  • /\n/Dewlineまですべて削除nして最初から始める
  • s/\.$//p「.」を削除すると、行末に残りの内容が印刷されます。

答え2

ピリオドを一致させるには、エスケープするか、角かっこで囲む必要があります。初期スペースを除外するには、正規表現にまったく追加しないでください。ただし、空白ではなく誤った文字の後にあるテキストを選択する危険があります。最後に(0個以上の一致)、後に指定された一致を使用する+代わりに(つまり、少なくとも1つの一致)を使用する場合は、数字の選択を複数回含める必要はありません。*

array=nslookup -q=srv SOME_ADDRESS | grep -o '[a-z0-9.-]\+\.$'

上記の正規表現では、大文字と下線は除外されます。必要に応じて[:alnum:]有効な記号を使用できます。

array=nslookup -q=srv SOME_ADDRESS | grep -o '[[:alnum:]_.-]\+\.$'

関連情報