sed
不要なビットを取り除くことにより、目的のフィールドを抽出するために使用できます。
pax> echo 'junk node:9-72-1408 more junk port:323 last junk'
| sed -E 's/^.*(node:[0-9]+-[0-9]*-[0-9]*).*(port:[0-9]+).*$/\1 \2/'
node:9-72-1408 port:323
ビットは.*
単にジャンクを表し、括弧は一致するテキストを「キャプチャ」するために使用されるため、置換(as\1
および\2
)で使用できます。
サイドバー:
お使いのバージョンが拡張正規表現をsed
サポートしていない場合、GNUの特定のバージョンと同様に、をサポートしている可能性があります。-E
-r
sed
+
それ以外の場合は、括弧と文字をエスケープする必要があります。
pax> echo 'junk node:9-72-1408 more junk port:323 last junk'
| sed 's/^.*\(node:[0-9]\+-[0-9]\+-[0-9]\+\).*\(port:[0-9]\+\).*$/\1 \2/'
node:9-72-1408 port:323
GNU sedのソースコードには、次の小さなスニペットが含まれています。
/* Undocumented, for compatibility with BSD sed. */
case 'E':
case 'r':
しかし、これは4.2で導入されたようです(つまり、4.2にはありますが、4.1シリーズの最後の4.1.5にはありません)。詳細はこちらをご覧ください。
また、変数に実際の値が必要な場合は、次のようなものを使用できます。
pax> inpstr='junk-here node:9-72-1408 more-junk port:323 last-junk'
pax> node=$(echo "$inpstr" | sed -E 's/^.*node:([0-9]+-[0-9]+-[0-9]+).*$/\1/')
pax> port=$(echo "$inpstr" | sed -E 's/^.*port:([0-9]+).*$/\1/')
pax> echo $inpstr
junk-here node:9-72-1408 more-junk port:323 last-junk
pax> echo $node
9-72-1408
pax> echo $port
323
(「より少ない」実装-r
のためのエスケープの使用または追加に関する以前のコメントを考慮に入れて)。sed