[英]Sed string reverse
我正在嘗試編寫sed命令來反轉字符串。 例如:如果我輸入“ america”作為輸入,則輸出應為“ acirema”。
請幫忙。
僅供參考:我可以使用Shell腳本(Python腳本)來執行此操作。 但是我無法使用SED做到這一點。
GNU sed手冊中有一個示例:
修訂版
/../! b
# Reverse a line. Begin embedding the line between two newlines
s/^.*$/\
&\
/
# Move first character at the end. The regexp matches until
# there are zero or one characters between the markers
tx
:x
s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/
tx
# Remove the newline markers
s/\n//g
像這樣運行它:
echo america | sed -f rev.sed
輸出:
acirema
基本上,這個想法是用換行標記字符串的開始和結束,然后,當換行在字符串中移動時,交換相鄰的字符。
除了GNU sed手冊中的版本以外,如果您不介意分兩個階段進行操作,則可以在非GNU sed中進行。
$ echo Canada | sed $'s/./&\\\n/g' | sed -ne $'x;H;${x;s/\\n//g;p;}'
adanaC
這使用格式替換在腳本中包括換行符。 它的工作方式是先將輸入字符串每個字符分成一行,然后將字符插入保持緩沖區的開頭。
什么? 插入字符?
當然... x
交換保留空間和模式空間,abd H
將(當前)模式空間附加到保留空間。 因此,對於每個字符,我們將其放置到容納空間中,然后將舊的容納空間附加到其上,從而反轉輸入。
最后的命令刪除換行符以重建原始字符串。
這適用於任何單個字符串,但是它將多行輸入連接為單個輸出字符串。
這可能對您有用(GNU sed):
sed -r 'G;:a;s/^(.)(.*\n)/\2\1/;ta;s/\n//' file
使用默認的保留緩沖區附加換行符。 在換行符后附加/插入第一個非換行符。 重復直到失敗,然后刪除(開頭)換行符。
不需要GNUsed的另一個解決方案:
sed -e 's/^/\
/' -e ':a' -e 's/\n\(.*\)\(.\)/\2\
\1/
ta' -e 's/\n//'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.