我有一個大文本檔案,其中包含這樣的行中的句子:
Alpha beta.
Gamma, delta, epsilon!
Eta: theta?
我想將其轉換為另一個文本檔案,其中每個單詞和標點符號位于單獨的行中,原始句子之間有空行,如下所示:
Alpha
beta
.
Gamma
,
delta
,
epsilon
!
Eta
:
theta
?
我一直在嘗試以下方法:
cat original.txt | xargs -n1 > new.txt
但這并沒有將標點符號與前導詞分開,句子之間也沒有空格:
Alpha
beta.
Gamma,
delta,
epsilon!
Eta:
theta?
這里的解決方案是什么?(由于 original.txt 檔案非常大,因此預計會出現在 Linux 命令列腳本中。)
uj5u.com熱心網友回復:
為了讓你開始,試試這個;
grep -Eo '[[:punct:]]|[[:alnum:]] ' original.txt
該-E選項選擇了比傳統 BRE 稍微更現代的正則運算式方言(grep這是第一個正則運算式工具,創建于 1969 年,沒有選項它試圖向后兼容,盡管不是那么遠。)
該-o選項表示將每個匹配項列印在單獨的行上,并且正則運算式選擇一個匹配項,該匹配項可以是單個標點符號,也可以是一系列字母數字符號。
(我認為您想要!?單獨的標點符號。如果您想要!?單獨但...作為單個匹配項,則必須使用特殊情況省略號; grep -Eo '\.\.\. |[[:punct:]]|[[:alnum:]] '。)
要獲得句子之間的空行,也可以切換到sed或 Awk。
awk '{ gsub(/ /, "\n"); gsub(/[^[:alnum:]\n]/, "\n&"); }
1; { print "" }' original.txt
該gsub命令執行正則運算式替換。我們用換行符替換每個空格序列,然后在每個標點符號前面添加一個換行符。最后,列印完句子后,我們列印一個空行。
對于更高級的預處理任務,您可能需要處理單詞中的標點符號,例如n'est-ce pas中的撇號或破折號,也許還有嵌套的引號等;也許到那時您需要找到一個現有的工具,而不是根據第一原則煞費苦心地構建自己的工具。最后,正則運算式只能帶你走這么遠。
uj5u.com熱心網友回復:
使用 GNU sed:
$ sed -E 's/\s /\n/g;s/[[:punct:]]/\n&/g;s/$/\n/' original.txt
Alpha
beta
.
Gamma
,
delta
,
epsilon
!
Eta
:
theta
?
uj5u.com熱心網友回復:
sed 's/$/\n/g; s/ /\n/g; s/\([,?\.:!]\)/\n\1/g' file
Alpha
beta
.
Gamma
,
delta
,
epsilon
!
Eta
:
theta
?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454497.html
