2016-08-19 102 views
0

您好我想使用sed命令删除字符串的一部分,但看起来像我遇到堆栈溢出似乎没有工作的所有选项。使用sed删除字符串部分

sub-285345_task-WM_dir-28_epi.nii 
sub-285345_task-LANGUAGE_dir-11_epi.nii.gz 

我想移除_task-***的一部分。我想删除任务 - **,键值对。

sed s/_task-.*//g 

这将删除任务后的dir - **。 sub-285345_epi.nii.gz

我怎样才能删除任务键值对?

+0

参见:[堆栈溢出正则表达式常见问题解答(http://stackoverflow.com/a/22944075/3776858) – Cyrus

+0

你还没有告诉我们什么'*** '代表“我想删除'_task - ***'”。它是否是下一个'_'或'-'或'.'还是别的?您的问题包括给定输入的预期输出。 –

回答

1

做:

sed 's/_task-[^_]*//' 

[^_]*将匹配高达下一_

实施例:

$ sed 's/_task-[^_]*//' <<<'sub-285345_task-WM_dir-28_epi.nii' 
sub-285345_dir-28_epi.nii 

$ sed 's/_task-[^_]*//' <<<'sub-285345_task-LANGUAGE_dir-11_epi.nii.gz' 
sub-285345_dir-11_epi.nii.gz 
+0

当task-和_dir之间只有一个单词时这是可以的。如果会有双下划线的双字不起作用。这是IMO更安全的方法:'sed's/\(_ task - 。* _ dir - \)/ _ dir-0 /'' –

+0

@DawidGrabowski这是为了说明OP的例子,如果他们想要我们可以带一个不同的。就目前而言,这很好地涵盖了OP的案例。 – heemayl

0

.*是贪婪。

尝试像

$ echo sub-285345_task-WM_dir-28_epi.nii | sed -r 's/_task-.*?_dir/_dir/' 
sub-285345_dir-28_epi.nii 
+0

'?'没用。 sed总是贪婪的。 – Cyrus

+1

没有意识到关于sed,只是基于正则表达式测试 –

0

下划线似乎是一个分隔符。在这种情况下,你可以使用

echo "sub-285345_task-WM_dir-28_epi.nii" | cut -d"_" -f1,3-