有一个字符串:
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