2010-05-14 253 views
2

我試圖用sed來替換字符串中的空白字符。例如,給定線:在字符串中刪除SED空白字符

var test = 'Some test text here.'; 

我想:

var test = 'Sometesttexthere.'; 

我嘗試使用(\x27匹配'):

sed 's|\x27\([^\x27[:space:]]*\)[[:space:]]|\x27\1|g 

,但只是給

var test = 'Sometest text here.'; 

任何想法?

回答

1

這是一個更復雜的sed腳本,但它沒有循環。你知道的,只是不同的緣故:

sed 'h;s/[^\x27]*\x27\(.*\)/\n\x27\1/;s/ //g;x;s/\([^\x27]*\).*/\1/;G;s/\n//g' 

這使得字符串的副本,打出一個(這將成爲下半年)的第一單引號丟棄上半年,替換所有的空格下半部分交換副本,將另一部分副本拆分,丟棄後半部分,將它們合併回去,並刪除用於拆分的新行和由G命令添加的新行。

編輯:

爲了選擇特定行進行操作,您可以使用一些選擇標準。在這裏,我指定的行必須包含一個等號和至少兩個單引號:

sed '/.*=.*\x27.*\x27.*/ {h;s/[^\x27]*\x27\(.*\)/\n\x27\1/;s/ //g;x;s/\([^\x27]*\).*/\1/;G;s/\n//g}' 

你可以使用任何正則表達式的作品最好的,包括並適當地排除了您的需求。

+0

好的解決方案。它似乎是O(n)而不是我的O(n^2)[Shlemiel畫家解決方案](http://en.wikipedia.org/wiki/Schlemiel_the_Painter%27s_algorithm),但這個事實可能與輸入長度在手邊。 – 2010-05-15 07:33:36

+0

你的sed(正則表達式)技能很明顯超過了我的。很好的解決方案。我想我應該提到的一件事是,並非每一行都有一個'。你的解決方案完美適用於那些行。那些沒有'最終得到複製。例如,一行var x = 2;將結束爲var x = 2; var x = 2; – blazeprogrammer 2010-05-17 15:01:39

+0

對於任何有興趣的人來說,這個解決方案比接受的解決方案要快得多,主要的區別在於,這個解決方案並不能完全按照需要(我的錯,而不是響應者的)工作。在我的測試文件中,這個解決方案需要0.06s,而接受的解決方案需要19.3s。 – blazeprogrammer 2010-05-17 15:24:10

0

您的命令行有兩個問題:

  • 首先,有一個失蹤\[^後。

  • 其次,即使使用g修飾符,也只會刪除第一個空格。爲什麼?因爲該修飾符導致在同一行內替換連續匹配。它不是而是從頭開始重新掃描整行。但這是必需的,因爲你的匹配是錨定在字符串文字的最初'

來解決這個問題最顯而易見的方法是使用一個環,由一個條件跳轉實現(跳轉與tLabel:Label; t跳轉如果因爲具有t上次測試匹配的至少一個s)。

這是最簡單的一個sed腳本(和你沒有逃跑的'),像這樣:

:a 
s|'\([^'[:space:]]*\)[[:space:]]|'\1| 
ta 

但是這是可以做到一個命令提示符。確切的語法可能取決於您的sed的香味,適合礦井(在Windows超級SED)被調用,像這樣:

sed -e ":a" -e "s|\x27\([^\x27[:space:]]*\)[[:space:]]|\x27\1|;ta" 

您需要兩個單獨的腳本表情,因爲標籤:a上延伸直至表達式結束。

+0

使用GNU'sed',分號結束標籤。 – 2010-05-14 22:39:20

+0

@丹尼斯:的確,現在我嘗試過了,它也適用於超級sed。好像我之前使用過另一個版本的sed,它不支持它,並且從來不打擾再次檢查。 – 2010-05-15 06:58:25

+0

該解決方案確實按照需要工作。正如你在上面的評論中指出的那樣,這不是最有效的。這與我的輸入長度有關,但對於我的應用程序來說,它足夠好。謝謝。 – blazeprogrammer 2010-05-17 15:07:10