2015-09-20 132 views
1

我試圖從文本文件中濾除包含除字母之外的任何字符的所有單詞。我已經瀏覽了stackoverflow和其他網站,但是我發現的所有答案都是針對不同場景的,而且我無法將其複製到我的目的中;我最近纔開始學習Unix工具。擺脫文本文件中包含特殊字符的所有單詞

這裏是我想要做的一個例子:

輸入:

@derik I was there and it was awesome! !! http://url.picture.whatever #hash_tag 

輸出:

I was there and it was awesome! 

所以標點符號的話可以留在文件中(其實我需要他們留下來),但任何具有特殊字符(包括標點符號)的子字符串都需要修剪掉。這可能可以用sed完成,但我無法弄清楚正則表達式。幫幫我。

謝謝!

+1

你有'punctuation'字符不屬於名單中刪除? – anubhava

+1

*特殊字符*是什麼意思? – melpomene

回答

0

你的要求不明確的,但所有這可能是你想要什麼:

$ awk '{rec=sep=""; for (i=1;i<=NF;i++) if ($i~/^[[:alpha:]]+[[:punct:]]?$/) { rec = rec sep $i; sep=" "} print rec}' file 
I was there and it was awesome! 
+1

這確實是我想要的。謝謝! – Novice

0

sed -E 's/[[:space:]][^a-zA-Z0-9[:space:]][^[:space:]]*//g'將擺脫任何以標點符號開頭的單詞。這會讓你在中途停下來。

  • [[:space:]]是任何空白字符
  • [^a-zA-Z0-9[:space:]]任何特殊字符
  • [^[:space:]]*被任意數量的非空白字符

再做一次沒有^,而不是第一[[:space:]]得到去除在行首開始的那些詞。

+0

您應該用'[:alnum:]'替換'a-zA-Z0-9',以便在使用字符類時保持一致。 –

+0

感謝您的回覆,但命令並不完全符合我需要做的。我可能不太清楚這個問題,所以這裏是我正在尋找的: 在開始或中間修剪出包含特殊字符(我的意思是任何不是字母的字符)的子字符串。 保留帶有標點符號的文字,例如「你好」, 在末尾修飾除了標點符號之外的特殊字符的子字符串,如「HA%」 再次感謝您的幫助! – Novice

+1

呼叫良好。謝謝@EdMorton – jazzabeanie

1

下面是它可以使用Perl來完成:

perl -ane 'for $f (@F) {print "$f " if $f =~ /^([a-zA-z-\x27]+[?!;:,.]?|[\d.]+)$/} print "\n"' file

我用這輸入文本作爲我的測試用例:

Hello, 
How are you doing? 
I'd like 2.5 cups of piping-hot coffee. 
@derik I was there; it was awesome! !! http://url.picture.whatever #hash_tag 

輸出:

Hello, 
How are you doing? 
I'd like 2.5 cups of piping-hot coffee. 
I was there; it was awesome! 

命令行選項:

  • -n環圍繞輸入文件的每一行,不會自動打印

  • -a自動分割模式 - 拆分輸入線到@F陣列。默認爲分裂的空白

  • -e執行Perl代碼

Perl代碼將每個輸入行到@F數組,然後遍歷每場$ F,並決定是否要打印。
在每行的末尾,打印換行符。

正則表達式^([a-zA-z-\x27]+[?!;:,.]?|[\d.]+)$對每個空格分隔單詞使用

  • ^開始於

  • [a-zA-Z-\x27]+一個或多個小寫或大寫字母或破折號或單引號(\ X27)

  • [?!;:,.]?零或下列其中一個標點符號:?!;:,。

  • (|)交替匹配

  • [\d.]+一個或多個數字或。

  • $結束

相關問題