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

撮影「bashで」文字通り、このようなことができます。

  • 文字列をセミコロンで区切られた配列に分割する

  • プレフィックスを要素ごとに削除し、結果を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

関連情報