範囲区切り文字から3番目のテキストセットを抽出する

範囲区切り文字から3番目のテキストセットを抽出する

ファイル.txt1行が含まれます:

[MOVING] From [/source/foo.txt] to [/dest/bar.txt]

基本的に、角かっこのペア内から3番目のグループを抽出する正規表現を探したいと思います。[]

予想する /dest/bar.txt

これまで、私は次のことを思い出しました。

$> cat file.txt | grep ".*From.*to.*" | grep -oP  '(?<=to ).*$' | cut -d "[" -f 2 |  cut -d "]" -f 1

動作しますが、エレガントなソリューションとはまったく異なります。誰でもこれを達成する方法を知っていますか?

答え1

grep -o '\[[^]]*\]$' file.txt | sed 's/\[//; s/\]//'

これにより、grepが行末に固定され、角かっこと必要なテキストが抽出されます。このsedコマンドは括弧を削除します。

答え2

$ echo "$a"
[MOVING] From [/source/foo.txt] to [/dest/bar.txt]
$ echo "$a" |egrep -o '\[.[^ ]+\]$'
[/dest/bar.txt]

答え3

cut目的の開口部ブラケットの後ろの部分を抽出するために使用でき、加工ブラケットの後ろの部分を取り除くには、sed完了を使用できます。

cut -d '[' -f 3 | sed 's/].*//'

または、単一のsedまたはawkコマンドを使用してこれを実行できます。

sed 's/^[^[]*\[\([^\]\)]*\][^[]*\[\([^\]\)]*\][^[]*\[\([^\]\)]*\].*$/\3/'
gawk -F '(^|\\])[^[]*(\\[|$)' '{print $4}'
awk '{split($0, a, "(^|\\])[^[]*(\\[|$)"); print a[4]}'

両方の awk コマンドでは、最初の区切り文字が文字列の先頭から始まるので、フィールド 1 は空であるため、3 番目の角かっこグループはフィールド 4 です。

関連情報