2016-08-19 117 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-