美好的一天。
我实际上有两个与shell中的sed命令相关的问题,它们非常相似。
第一个问题是如何使用sed来获取文件名并将其名称的一部分移除,如下例所示:
原始档案:
BAT_MAN_T_spades_proc_whatever_t6_12345_14785963214785_12345.txt
我希望文件名看起来像:
BAT_T_spades_proc_whatever_t6_12345_14785963214785_12345.txt
我只想在第一个下划线之后将“MAN”部分从原始文件名中删除。
第二个问题是关于我刚才在文件中找到的以下sed命令:
random_string_var_name=$(echo $file_name | sed -r 's/^[^_]*_[^_]*_(.*_t[0-9]{1}).*(_[0-9]*)\.txt/_\1\2/')
这几乎可以将文件名的一部分保存在一个变量上,如下面的例子:
档案名称:
BAT_MAN_T_spades_proc_whatever_t6_12345_14785963214785_12345.txt
sed命令得到了什么:
T_spades_proc_whatever_t6_12345
我得到了它的功能,但我不明白该命令是如何工作的,所以我想明白这一点。
答案 0 :(得分:2)
我只想在第一个下划线之后将“MAN”部分从原始文件名中删除。
echo "BAT_MAN_T_spades_proc_whatever_t6_12345_14785963214785_12345.txt" | sed "s/MAN_//"
如果我想在第一个下划线后删除第一个单词并保留其他内容,该怎么办?
echo "BAT_MAN_T_spades_proc_whatever_t6_12345_14785963214785_12345.txt" | sed -r 's/^([^_]*)_[^_]*(_.*)/\1\2/'
这是做什么的:
echo $file_name | sed -r 's/^[^_]*_[^_]*_(.*_t[0-9]{1}).*(_[0-9]*)\.txt/_\1\2/')
-r
:以“扩展正则表达式”模式运行sed ^
:匹配单词的开头[^_]*
匹配除下划线0或更多次以外的所有内容_
匹配下划线(.*_t[0-9]{1})
匹配零个或多个后跟_t且只有一个数字的内容。此匹配存储在变量1 (_[0-9]*)
同样的事情,只是没有前缀/_\1\2
:在开头用_替换整个文件名,用第一个括号中的匹配和第二个括号中的匹配我建议阅读正则表达式。它们很重要,而且真的很难进入
答案 1 :(得分:1)
我认为你可能有别的东西而不是#34; MAN"你可能有" WOMAN"。所以你可以使用:
file_name=BAT_WOMAN_T_spades_proc_whatever_t6_12345_14785963214785_12345.txt
echo $file_name | sed 's/_[^_]*_/_/'