簡體   English   中英

用換行符/段落標記替換所有空格以生成單詞列表

[英]Replace all whitespace with a line break/paragraph mark to make a word list

我正在嘗試為我們在課堂上翻譯的希臘文字詞匯表。 我想用段落標記替換每個空格或制表符,以便每個單詞都出現在它自己的行上。 任何人都可以給我sed命令,並解釋我在做什么? 我還在努力想出去。

對於相當現代的sed版本,編輯標准輸入以產生標准輸出

$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g'
τέχνη
βιβλίο
γη
κήπος

如果你的詞匯在文件命名為lesson1lesson2 ,重定向的sed的標准輸出到文件all-vocab

sed -E -e 's/[[:blank:]]+/\n/g' lesson1 lesson2 > all-vocab

這是什么意思:

  • 字符類 [[:blank:]]匹配單個空格字符或單個制表符。
    • 使用[[:space:]]來匹配任何單個空格字符(通常是空格,制表符,換行符,回車符,換頁符和垂直制表符)。
    • +量詞表示匹配前一個模式中的一個或多個
    • 所以[[:blank:]]+是一個包含所有空格或制表符的一個或多個字符的序列。
  • 替換中的\\n是您想要的換行符。
  • 末尾的/g修飾符意味着盡可能多次執行替換,而不是僅執行一次。
  • -E選項告訴sed使用POSIX擴展正則表達式語法,特別是在這種情況下使用+量詞。 如果沒有-E ,你的sed命令就會變成sed -e 's/[[:blank:]]\\+/\\n/g' (注意使用\\+而不是簡單的+ 。)

Perl兼容的正則表達式

對於那些熟悉Perl兼容的正則表達式和支持PCRE的sed的人,使用\\s+來匹配至少一個空白字符的運行,如

sed -E -e 's/\s+/\n/g' old > new

要么

sed -e 's/\s\+/\n/g' old > new

這些命令從old文件中讀取輸入,並將結果寫入當前目錄中名為new的文件。

最大的便攜性,最大的無效性

版本7 Unix開始回到幾乎任何版本的sed,命令調用更加巴洛克式。

$ echo 'τέχνη βιβλίο γη κήπος' | sed -e 's/[ \t][ \t]*/\
/g'
τέχνη
βιβλίο
γη
κήπος

筆記:

  • 在這里,我們甚至不假設存在簡單+量詞,並使用單個空格或制表符[ \\t] )進行模擬,然后是零或多個( [ \\t]* )。
  • 同樣,假設sed不理解\\n換行,我們必須逐字地將它包含在命令行中。
    • \\和命令第一行的結尾是一個延續標記,它會轉移緊隨其后的換行符,並且命令的其余部分位於下一行。
      • 注意:轉義換行符之前必須沒有空格。 也就是說,在第一行的末尾必須嚴格反斜線后跟端的行。
    • 這個容易出錯的過程有助於理解為什么世界會轉移到可見角色,並且您需要謹慎地嘗試使用復制粘貼來執行命令。

關於反斜杠和引用的注釋

上面的命令都使用單引號( '' )而不是雙引號( "" )。 考慮:

$ echo '\\\\' "\\\\"
\\\\ \\

也就是說,與雙引號字符串相比,shell將不同的轉義規則應用於單引號字符串。 您通常希望使用引號保護正則表達式中常見的所有反斜杠。

可行的方法是:

sed -e 's/[ \t][ \t]*/\
/g'

這是反斜杠和斜杠之間的實際換行符。 許多sed實現都不知道\\n ,所以你需要一個文字換行符。 換行符之前的反斜杠可防止sed對換行符感到不安。 (在sed腳本中,命令通常由換行符終止)

使用GNU sed,您可以在替換中使用\\n ,在正則表達式中使用\\ s:

sed -e 's/\s\s*/\n/g'

GNU sed還支持“擴展”正則表達式(即egrep樣式,而不是perl樣式),如果你給它-r標志,那么你可以使用+

sed -r -e 's/\s+/\n/g'

如果這只適用於Linux,你可以使用GNU命令,但如果你想在非GNU sed的系統上工作(例如:BSD,Mac OS-X),你可能想要更多便攜式選擇。

上面列出的sed的所有示例都在一個平台或另一個平台上中斷。 它們都不適用於Mac上附帶的sed版本。

但是,在安裝了Perl的任何機器上,Perl的正則表達式都是一樣的:

perl -pe 's/\s+/\n/g' file.txt

如果要保存輸出:

perl -pe 's/\s+/\n/g' file.txt > newfile.txt

如果您只想要單獨出現的單詞:

perl -pe 's/\s+/\n/g' file.txt | sort -u > newfile.txt
  1. 選項1

     echo $(cat testfile) 
  2. 選項2

     tr ' ' '\\n' < testfile 

這應該做的工作:

sed -e 's/[ \t]+/\n/g'

[ \\t]表示空格或制表符。 如果你想要任何空間,你也可以使用\\s

[ \\t]+表示您想要的多個空格或制表符(但至少有一個)

s/x/y/表示用s/x/y/替換模式x(這里\\n是新行)

最后的g意味着你必須重復每行中發生的次數。

您可以使用POSIX [[:blank:]]來匹配水平空白字符。

sed 's/[[:blank:]]\+/\n/g' file

或者您也可以使用[[:space:]]而不是[[:blank:]]

例:

$ echo 'this  is a sentence' | sed 's/[[:blank:]]\+/\n/g'
this
is
a
sentence

您也可以使用xargs

cat old | xargs -n1 > new

要么

xargs -n1 < old > new

使用gawk

gawk '{$1=$1}1' OFS="\n" file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM