2012-12-26 74 views
1

我想從使用sed的文件反轉字符串。但是,我希望表達式不要反轉數字和特殊字符。如何僅反轉字符串不在行中的數字和特殊字符

例如,請考慮以下輸入:

112358 is a fibonacci sequence... 
a test line 
124816 1392781 
final line... 

我的預期成果是:

112358 si a iccanobif ecneuqes... 
a tset enil 
124816 1392781 
lanif enil... 

我已經在幾個方面嘗試過,但我無法找到的精確表達式。 我曾嘗試下面的表達式,但它已經扭轉了整個字符串:

sed '/\n/!G;s/\([.]\)\(.*\n\)/&\2\1/;//D;s/.//' 
+1

應該發生什麼? –

+1

這是一個家庭作業,因爲別人問同樣的問題[這裏](http://askubuntu.com/questions/232846/how-to-reverse-the-lower-case-characters-in-word-using-only -SEd)。 – jfg956

回答

3

這sed腳本將做的工作:

#!/usr/bin/sed 

# Put a \n in front of the line and goto begin. 
s/^/\n/ 
bbegin 

# Marker for the loop. 
:begin 

# If after \n is a lower case sequence, copy its last char before \n and loop. 
s/\n\([a-z]*\)\([a-z]\)/\2\n\1/ 
tbegin 

# If after \n is not a lower case sequence, copy it before \n and loop. 
s/\n\([^a-z]*[^a-z]\)/\1\n/ 
tbegin 

# Here, no more chars after \n, simply remove it before printing the new line. 
s/\n// 
3

我會用Perl這一點。該代碼是更可讀:

perl -pe 's/\b([A-Za-z]+)\b/reverse($1)/ge' file 

結果:如果輸入包含其中包含數字的字符串,比如'this5string`

112358 si a iccanobif ecneuqes... 
a tset enil 
124816 1392781 
lanif enil... 
相關問題