Bashで複数の区切り文字に文字列を分割する

Bashで複数の区切り文字に文字列を分割する

文字列があります:

onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt

私はそれを分割し.;ファイル名の前のプレフィックスを削除して次のように見せたいと思います。

file.001.txt ; file.0.98.txt ; file.14.txt

どんなアイデアがありますか?

答え1

sed -e 's/[^.]*.//' -e 's/;[^.]*./; /g'

これは、最初から最後まで最短の部分文字列を削除して.から、;結果の文字列に対して操作を実行できます。

答え2

取る「カーニバルから」文字通りこのようなことができます。

  • 文字列を配列に分割し、セミコロンで区切ります。

  • 要素ごとにプレフィックスを削除し、結果をIFSの最初の文字で区切られた文字列に保存します。

  • 区切り文字の後にスペースをグローバルに追加します。

IFS注:後で復元できるように現在の状態を保存したい場合があります。

IFS=";"
read -a arr <<< "onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt"
printf -v str "${arr[*]#*.}"
printf "%s\n" "${str//;/; }"

与える

file.001.txt ; file.0.98.txt ; file.14.txt

答え3

またはsed...

s="onetwothree.file.001.txt ; threefourfive.file.0.98.txt ; fivefoursix.file.14.txt"
sed -E "s/(^|; )[^\.]+\./\1/g" <<<$s

(^|; )[^\.]+\.

^行の先頭で始まるか(セミコロンとスペース)で|始まり;、後に[^\.]+\.テキストのない連続シーケンスが続く.すべての子要素を見つけます。するテキストで終わる.

\1次に、すべてをキャプチャグループに置き換えます。(^|; )

出力

file.001.txt ; file.0.98.txt ; file.14.txt

関連情報