Unix中使用sed命令的子字符串文件名

时间:2019-10-15 12:30:52

标签: sed

我想使用sed命令在Unix中将文件名字符串化。

文件名:Test_Test1_Test2_10082019_030013.csv.20191008-075740

我希望在第三个下划线之后的字符或(在Test2之后的所有字符)需要打印。

可以使用sed命令完成此操作吗?

我已经尝试过此命令

sed 's/^.*_\([^_]*\)$/\1/' <<< 'Test_Test1_Test2_10082019_030013.csv.20191008-075740' 

但这给出的结果为030013.csv.20191008-075740 我需要10082019_030013.csv.20191008-075740

谢谢 内哈

3 个答案:

答案 0 :(得分:3)

要从一开始就删除第三个下划线,可以使用

sed 's/^\([^_]*_\)\{3\}//' <<< 'Test_Test1_Test2_10082019_030013.csv.20191008-075740'

这将删除由3组(任意数量的非下划线字符后跟下划线)组成的初始部分。结果是

10082019_030013.csv.20191008-075740

如果使用GNU sed,则可以将其切换为扩展的正则表达式,并省略反斜杠。

sed -r 's/^([^_]*_){3}//' <<< 'Test_Test1_Test2_10082019_030013.csv.20191008-075740'

答案 1 :(得分:2)

请您尝试以下。

sed 's/\([^_]*\)_\([^_]*\)_\([^_]*\)_\(.*\)/\4/'  Input_file

或者按照Bodo的好建议:

sed 's/[^_]*_[^_]*_[^_]_\(.*\)/\1/' Input_file

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed 's/_/\n/3;s/.*\n//;t;s/Test2/\n/;s/.*\n//;t;d' file

用换行符替换第三个_,然后删除所有内容,包括第一个换行符。如果成功,请退出并打印结果。否则,请使用Test2尝试相同的方法,如果失败,则删除整行。