Text-Processing

使用 sed 撤消字母間距

  • July 3, 2015

我有一個源文本文件,其中包含一些單詞的字母間距,例如這個問題中的“字母間距”一詞(即,單詞的字母之間有一個空格字元。

如何使用 sed 撤消字母間距?

\{[A-Za-z] \}+[A-Za-z]擷取一個字母間隔的單詞並去掉s/ //g空格這樣的模式,但是我如何從一行文本中提取一個字母間隔的單詞並撤消字母間隔而不損害文本其餘部分中的合法空格字元?

你可以這樣做:

sed     -e's/ \([^ ][^ ]\)/\n\1/g' \
       -e's/\([^ ][^ ]\) /\1\n/g' \
       -e's/ //g;y/\n/ /
'       <<\IN
I have a source text file containing text where
some words are l e t t e r s p a c e d
like the word "letterspaced" in this question
(i.e., there is a space character between the
letters of the word. 
IN

這個想法是首先找到前面或後面有兩個或多個非空格字元的所有空格,並將它們作為換行符放在一邊。接下來只需刪除所有剩餘的空格。最後,將所有換行符翻譯回空格。

這並不完美 - 如果不將每個單詞的整個字典合併在一起,您可能會使用您將獲得的最佳效果,這是某種啟發式方法。不過這個還不錯

此外,根據sed您使用的情況,您可能還必須使用文字換行符來代替*n*前兩個替換語句中使用的 I。

但是,除了這個警告之外,這將適用於任何 POSIX 並且工作得非常快sed。它不需要做任何代價高昂的先行或後行,因為它只是節省了不可能,這意味著它可以處理單個地址中每個替換的所有模式空間。

輸出

I have a source text file containing text where some
words are letterspaced
like the word "letterspaced" in this question
(i.e., there is a space character between the
letters of the word.

引用自:https://unix.stackexchange.com/questions/213766