使用sed删除字符串部分
您好我想使用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
我怎样才能删除任务键值对?
做:
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
当task-和_dir之间只有一个单词时这是可以的。如果会有双下划线的双字不起作用。这是IMO更安全的方法:'sed's/\(_ task - 。* _ dir - \)/ _ dir-0 /'' –
@DawidGrabowski这是为了说明OP的例子,如果他们想要我们可以带一个不同的。就目前而言,这很好地涵盖了OP的案例。 – heemayl
.*
是贪婪。
尝试像
$ echo sub-285345_task-WM_dir-28_epi.nii | sed -r 's/_task-.*?_dir/_dir/'
sub-285345_dir-28_epi.nii
'?'没用。 sed总是贪婪的。 – Cyrus
没有意识到关于sed,只是基于正则表达式测试 –
下划线似乎是一个分隔符。在这种情况下,你可以使用
echo "sub-285345_task-WM_dir-28_epi.nii" | cut -d"_" -f1,3-
参见:[堆栈溢出正则表达式常见问题解答(http://stackoverflow.com/a/22944075/3776858) – Cyrus
你还没有告诉我们什么'*** '代表“我想删除'_task - ***'”。它是否是下一个'_'或'-'或'.'还是别的?您的问题包括给定输入的预期输出。 –