2017-10-08 133 views
2

我想用反斜槓'\'替換所有斜槓'/',反之亦然。將一個字符替換爲另一個字符,反之亦然

我天真的解決方案是tr這樣做,但後來我需要一個佔位符,我不認爲是很漂亮:

tr '/' '¢' | tr '\\' '/' | tr '¢' '\\' 

,這也只是只要有從未出現工作'¢'在我的輸入中,在我的情況下最有可能就足夠了 - 但是,嘿,誰知道?當然,通過使用sed,然後用一些任意隨機的字符串替換「¢」(比如'½|#&'__''或其他),可以很容易地採用相同的想法並使其更加健壯。

但我想知道是否有一個單一的bash命令來實現這一點,這將使這個東西更短,更可讀和更強大。也許sed可以開箱即用嗎?


雖然我們在這,這個操作的正確名稱是什麼?像'雙向替換'。如果我知道我的谷歌搜索可能會更有成效。我也試過'交換字符',但我只發現經常更換東西。

回答

5

因爲tr只會傳遞一次字符,所以不需要中間字符,因此字符永遠不會被替換多次。下面tr命令應該這樣做:

tr '/\' '\\/' <<< '//\\ then \\// and/and finally a \ in the string' 

產生

\\// then //\\ and \ and finally a/in the string 

或者更簡單地說:

tr ab ba <<< "ab ba bb aa" # yields "ba ab aa bb" 

您還可以使用sed

sed 'y#/\\#\\/#' <<< '//\\ then \\// and/and finally a \ in the string' 

毅視場

\\// then //\\ and \ and finally a/in the string 

man sed

[2addr] Y /字符串1 /字符串2/

與字符串2對應的字符替換字符的所有出現在字符串1在模式空間。 可以使用除反斜槓或換行符之外的任何字符來代替斜線來分隔字符串。 在string1和string2中,反斜槓後跟一個「n」由一個換行符替換。 一對反斜槓被文字反斜槓替代。最後,任何其他字符(除了換行符)之後的反斜槓都是文字字符。

+2

謝謝!也許你可以在那裏添加更普通的東西(我從中學到的)是:用'tr'替換髮生在元素方面。 'tr ab xy''a'被'x'取代,'b'被'y'取代,因此'tr ab ba'將用'b'取代'a',反之亦然。這是我對'tr'缺少的更一般的東西。帶反斜槓的例子有點不幸,因爲它是逃避的,這實際上不是我的觀點,而是混淆了這個問題(因此也就是答案)。 – dingalapadum

+1

如果你編輯你的答案並添加上述內容,我很樂意接受它(明天) - 它也會更好地適應標題。順便說一句。我喜歡編輯 – dingalapadum

1
tr \\\\/ /\\\\ 

輸入:

//fgdf\\ 

輸出:

\\fgdf// 

爲什麼4個反斜槓?兩個反斜槓在外殼中形成一個反斜槓,因此tr收到\\//\\。它有自己的反斜槓序列,所以它將兩個反斜槓解釋爲迴旋。

+2

「爲什麼4反斜槓?」的問題的正確答案是「因爲我沒有適當地引用我的字符串」。除非需要雙引號才能執行特定任務(例如可變擴展),否則始終使用雙引號除非您需要不帶引號執行特定任務(例如通配符擴展),否則始終使用單引號引用腳本/字符串。 –

+0

行情並不比沒有引號好,不要使表達更簡單,也不要添加任何內容。 – user31264

+0

莫頓先生剛剛接過我,試圖在我的答案中添加負面評論。這個人對我的回答非常積極,可能對我有些不滿。 – user31264

相關問題