在 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

相关内容