2012-12-21 50 views
0

我該如何在sed中做什麼tr "ae" "ea"呢?我不能使用像this question這樣的臨時字符串,因爲我不知道字符串保證不會出現在文本中。同時交換兩個字符串

也許我可以先用一個反斜槓等等來逃避所有'a','e'和'\'......還是有更簡單的方法嗎?

謝謝。

回答

1

您可以使用transform (y) command;

sed 'y/ae/ea/' 

>回聲aerodame | sed的「Y/AE/EA /」
earodema

+0

我很想知道爲什麼我被低估了這個答案。當然,聽起來對我來說更容易... ...? –

+0

[後]可能是因爲y /必須是靜態寬度,並會抱怨它,但是,tr,默認情況下,雖然它也需要靜態寬度,但不會抱怨它,因此如果可互換使用會導致細微的錯誤 – osirisgothra

3

你有你的答案,但你的WRT聲明說:「在這個問題上,我不能使用臨時串類的,因爲我不知道一個字符串,它是保證不會出現在文本中。「你可以創建一個字符串,像這樣的:

sed 's/@/@A/g; s/foo/@B/g; s/bar/foo/g; s/@B/bar/g; s/@A/@/g' file 

所有的「@」字符以上轉換爲字符串「@A」,那麼首先將「富」 s到「@Bs」交換foo和酒吧。此時,您可以保證在文本中沒有「@B」,因爲每個原始的「@」現在都有一個「A」,後面是第一個//。其餘的應該是顯而易見的。

這是一個非常有用的技術,當你需要做其他操作使用一些其他的命令(S)文件和需要一些字符串有保證不被輸入:

sed 's/@/@A/g' file | <commands using @B, @C, etc.> | sed 's/@A/@/g' 

顯然,你需要以確保您在中間使用的任何命令都不會生成「@A」(或您選擇的任何替換字符串)作爲其輸出的一部分!

+0

這很好。 – potrzebie