角かっこで囲まれた数字を切り取って、テキストの先頭に配置するにはどうすればよいですか?
例えば:
some_text123_[12345]_some_text
after:
12345_some_text123_[]_some_text
sed
マッチングを使用してみてください:
正規表現は(.*) (\[[0-9]+\]) (.*)
(スペースなしで)可能性があります。次に、一致をグループに2-1-3
順番に置き換えます。
$ echo "some_text_[12345]_some_text" | sed "s_(.*)\[([0-9]+)\](.*)_\2\1[]\3_g"
12345some_text_[]_some_text
使ってみperl
ました。
このperlワンライナーは機能するはずです。
$ echo some_text123_[123]_some_text | perl -ne 'print "$1_", "$`", "$'\''\n" if /\[(\d+?)\]/;' -
perl正規表現エンジンからの特別な変数を説明するだけです:
$1-マッチングで保持したいものです。
$`-試合前のすべて
$'-試合後のすべて
ホールドスペースを使用して物を動かす別のsedバリエーションがあります。それが最善の方法というわけではありませんが、それは一種の楽しみです。
sed -e 'h;s/.*\[\([0-9]*\)\].*/\1/;x;s/\[.*\]/[]/;H;g;s/\n//'
hコマンドは、現在の行をホールドスペースにコピーします。次に、[と]の間の数字を分離します。xは元の行の番号を交換するため、ホールドスペースには番号のみが含まれます。次に、今回は[]の間のすべてを破棄し、その結果を保留スペースの数値に追加します。ホールドスペースを取り戻し(g)、埋め込まれた改行を削除します。
$ echo "some_text123_[12345]_some_text" | sed -e 'h;s/.*\[\([0-9]*\)\].*/\1/;x;s/\[.*\]/[]/;H;g;s/\n//'
12345some_text123_[]_some_text