![](/img/trans.png)
[英]I want to replace all the occurrence of a "word" with <mark>word</mark>
[英]Replace all whitespace with a line break/paragraph mark to make a word list
我正在嘗試為我們在課堂上翻譯的希臘文字詞匯表。 我想用段落標記替換每個空格或制表符,以便每個單詞都出現在它自己的行上。 任何人都可以給我sed命令,並解釋我在做什么? 我還在努力想出去。
對於相當現代的sed版本,編輯標准輸入以產生標准輸出
$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g'
τέχνη
βιβλίο
γη
κήπος
如果你的詞匯在文件命名為lesson1
和lesson2
,重定向的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兼容的正則表達式和支持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]*
)。 \\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
echo $(cat testfile)
選項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.