2013-01-21 46 views
6

我正在嘗試編寫一個正則表達式來替換文件中存在的一個或多個'+'符號。我試過如下:使用awk替換正則表達式模式

echo This++++this+++is+not++done | awk '{ sub(/\++/, " "); print }' 
This this+++is+not++done 

預計:

This this is not done 

任何想法,爲什麼這個沒有工作?

回答

8

使用gsub這確實全局替換:

echo This++++this+++is+not++done | awk '{gsub(/\++/," ");}1' 

sub功能只替換1日的比賽,全部更換比賽用gsub

+1

謝謝了! –

2

您也可以使用sed

echo This++++this+++is+not++done | sed -e 's/+\{1,\}/ /g' 

這符合一個或多個+,並用空格替換它。

5

還是tr命令:

echo This++++this+++is+not++done | tr -s '+' ' ' 
+0

'-s'非常方便。我會說這是簡單性更好的解決方案。 – alex

+0

謝謝!我發現'tr'是一個非常值得讚賞的命令。 – radical7

+0

這是一個很酷的。 – Suku

4

試試這個

echo "This++++this+++is+not++done" | sed -re 's/(\+)+/ /g'

4

慣用awk的解決辦法是剛剛輸入字段分隔符轉化爲輸出的分隔符​​:

$ echo This++++this+++is+not++done | awk -F'++' '{$1=$1}1' 
This this is not done 
-1
echo "This++++this+++is+not++done" | sed 's/++*/ /g' 
+0

這回答了問題第一行中列出的任務。 –

0

如果你有機會到您的計算機上的節點,則可以通過安裝rexreplace

npm install -g regreplace 

做到這一點,然後再運行

rexreplace '\++' ' ' myfile.txt 

,如果你在一個目錄有以上文件data你可以做

rexreplace '\++' ' ' data/*.txt 
+0

如果將npm的大小與awk進行比較,並將tr替換爲rexreplace的速度,那麼您可能會明白這是使用炸彈打開螺母。 –

+0

將npm與awk進行比較沒有任何意義。我認爲你的意思是rexreplace的大小。 tr的速度肯定會更好。答案旨在提供在語法更容易掌握的情況下使用工具的便利性。它讓我想起了C引入時的討論,並且人們認爲生成的代碼與組裝時相比是混亂和緩慢的。 – mathiasrw