Bash Shell使用sed移除字符串的一部分

Bash Shell使用sed移除字符串的一部分,bash,shell,sed,Bash,Shell,Sed,你好 实际上,我有两个问题与shell中的sed命令有关,它们非常相似 第一个问题是如何使用sed获取文件名并删除其名称的一部分,如下面的示例所示: 原始文件: BAT_MAN_T_spades_proc_which_t6_12345_14785963214785_12345.txt 我希望文件名看起来像什么: BAT_T_spades_proc_where_t6_12345_14785963214785_12345.txt 我只希望第一条下划线后面的MAN部分从原始文件名中删除 第二个问题是关

你好

实际上,我有两个问题与shell中的sed命令有关,它们非常相似

第一个问题是如何使用sed获取文件名并删除其名称的一部分,如下面的示例所示:

原始文件:

BAT_MAN_T_spades_proc_which_t6_12345_14785963214785_12345.txt

我希望文件名看起来像什么:

BAT_T_spades_proc_where_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
我知道它的功能,但我不明白这个命令是如何工作的,所以我想了解它

我只希望第一条下划线后面的MAN部分从原始文件名中删除

如果我总是想删除第一条下划线后的第一个单词,并保留其他所有内容,该怎么办

这是做什么的:echo$file\u name | sed-r的/^[^\u]*.*.*.*.[0-9]{1}.*.\[0-9]*\.txt/\u1\2/'

-r:在扩展正则表达式模式下运行sed ^:匹配单词的开头 [^(]*匹配除下划线0或更多次以外的所有内容 _下划线匹配 .*_t[0-9]{1}匹配任何后跟_t的数字中的零个或多个,并且只匹配一个数字。此匹配项存储在变量1中 _[0-9]*同样的事情,只是没有前缀 /_\1\2:将整个文件名替换为开头的u,第一个括号中的匹配项和第二个括号中的匹配项 我建议阅读正则表达式。他们很重要,也不是很难进入

我只希望第一条下划线后面的MAN部分从原始文件名中删除

如果我总是想删除第一条下划线后的第一个单词,并保留其他所有内容,该怎么办

这是做什么的:echo$file\u name | sed-r的/^[^\u]*.*.*.*.[0-9]{1}.*.\[0-9]*\.txt/\u1\2/'

-r:在扩展正则表达式模式下运行sed ^:匹配单词的开头 [^(]*匹配除下划线0或更多次以外的所有内容 _下划线匹配 .*_t[0-9]{1}匹配任何后跟_t的数字中的零个或多个,并且只匹配一个数字。此匹配项存储在变量1中 _[0-9]*同样的事情,只是没有前缀 /_\1\2:将整个文件名替换为开头的u,第一个括号中的匹配项和第二个括号中的匹配项
我建议阅读正则表达式。他们很重要,也不是很难进入

我认为你可能有男人以外的东西,你可能有女人。因此,您可以使用:

file_name=BAT_WOMAN_T_spades_proc_whatever_t6_12345_14785963214785_12345.txt
echo $file_name | sed 's/_[^_]*_/_/'

我认为你可能有男人以外的东西,你可能有女人。因此,您可以使用:

file_name=BAT_WOMAN_T_spades_proc_whatever_t6_12345_14785963214785_12345.txt
echo $file_name | sed 's/_[^_]*_/_/'

添加:如果OP想要重命名文件,他们可以使用工具。出于好奇,我该如何使用sed始终使用下划线分隔的文件名的第二个单词,因为有时文件名会更改,我计划将此命令放入脚本中?@otorinolaringologista man我不明白。你的意思是,你怎么能只在BAT_MAN_T_spades_proc_which_t6_12345_14785963214785_12345.txt中匹配MAN?这是因为,有时候,文件名非常小,他们的名字不是BAT_MAN_T_等,而是BAT_WOMAN_T_*或GREEN_LANTERN_T_等。如果我想删除第一条下划线后的第一个单词,并保留所有其他内容,该怎么办?补充:如果OP想重命名文件,他们可以使用工具。出于好奇,我如何使用sed始终使用下划线分隔的文件名的第二个单词,因为有时文件名会更改,我计划将此命令放在脚本中?@Otorrinolaringologista man我不明白。你的意思是,你怎么能只在BAT_MAN_T_spades_proc_which_t6_12345_14785963214785_12345.txt中匹配MAN?这是因为,有时候,文件名非常小,它们也被命名为BAT_WOMAN_T_*或GREEN_LANTERN_T_等,而不是BAT_MAN_T_等。如果我想总是删除第一个下划线后的第一个单词,保留所有其他内容,怎么办?你甚至不应该为此需要使用sed。。。尝试echo${file\u name//MAN\u/}…您甚至不应该为此需要sed。。。请尝试echo${file\u name//MAN\u/}。。。
file_name=BAT_WOMAN_T_spades_proc_whatever_t6_12345_14785963214785_12345.txt
echo $file_name | sed 's/_[^_]*_/_/'