Shell使用sed

时间:2017-01-20 15:58:50

标签: bash shell sed

美好的一天。

我实际上有两个与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

我得到了它的功能,但我不明白该命令是如何工作的,所以我想明白这一点。

2 个答案:

答案 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/_[^_]*_/_/'