文字列があります:
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