2017-10-08 61 views
2

すべてのスラッシュ '/'をバックスラッシュ '\'に置き換える必要があります。文字列内である文字を別の文字に置き換えたり、逆の文字を文字列に置き換えたりします。

私の素朴な解決策はtrでこれを行うことですが、その後、私は、私は考えていないプレースホルダ文字は、非常にきれいである必要があります。

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

と、これはまた、唯一の限りAが表示されませんように動作私の意見では、私の場合はおそらく十分でしょうが、だれが知っていますか?もちろん、sedを使用することで、この同じアイディアをより堅牢にしてから、 '¢'を何らかの任意のランダムな文字列( '½|#&¬_$'など)に置き換えることは簡単です。

しかし、これを達成するための単一のbashコマンドがあるかどうかを知りたかったので、これを短く、読みやすく、堅牢にしました。多分sedはこれを箱から出すことができますか?


この操作の正しい名前は何ですか。 '双方向の置き換え'のように。もし私のGoogle検索がおそらくより有益だろうと分かったら。私はまた 'スワップ文字'を試みたが、私は定期的なものを交換することしか見つけなかった。

答えて

5

trは文字列を1回しか通過しないので、文字が1回以上置換されることはないので、中間文字は必要ありません。次trのコマンドは、それを行う必要があります。

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

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

それとも、もっと簡単に得られます。

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

YI:

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

またsedを使用することができますman sedからELDより

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

[2addr] Y /文字列1 /文字列2/

は文字列2からの対応する文字とパターンスペースに文字列1の文字のすべてのオカレンスを置き換え。 文字列の区切りにスラッシュの代わりに、バックスラッシュまたは改行以外の文字を使用できます。 string1とstring2の中では、バックスラッシュとそれに続く `` n ''は改行文字に置き換えられます。 バックスラッシュのペアは、リテラルのバックスラッシュに置き換えられます。最後にバックスラッシュの後ろに改行を除く他の文字があれば、それはリテラル文字です。

+2

ありがとうございます!多分もっと一般的なこと(私がこれから学んだこと)があることを、あなたがそこに加えることができるかもしれません: 'tr'置換は要素ごとに起こります。 'tr ab xy'では 'a'が 'x'に置き換えられ、 'b'が 'y'に置き換えられ、' tr ab ba'は 'a'を 'b'に置き換えます。それは私が 'tr'に関して欠けていたもっと一般的なことでした。バックスラッシュの例は、エスケープのために少し残念ですが、これは実際に私の問題ではなく、種類の混乱を招くことであり、それによって答えが得られました。 – dingalapadum

+1

あなたの答えを編集して上記のものを追加すると、私はそれを受け入れることができます(明日) - それはまた、より良いタイトルに適合するでしょう。 Btw。私は編集が好きです – dingalapadum

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

入力:

//fgdf\\ 

出力:

\\fgdf// 

なぜ4つのバックスラッシュ? trは、\\//\\を受け取るため、2つのバックスラッシュでシェル内にバックスラッシュが1つ作成されます。それ自身のバックスラッシュシーケンスを持つので、2つのバックスラッシュをバックシャーシとして解釈します。

+2

「なぜ4つのバックスラッシュを使うのですか?」というあなたの質問に対する正解は '私の弦を適切に引用しなかったためです。特定のタスク(例:変数展開)を実行するために二重引用符が必要な場合や、特定のタスク(ワイルドカード展開など)を実行するための引用符を必要としない限り、常に二重引用符を使用する場合を除き、 –

+0

引用符は引用符で囲まれたものよりも優れているわけではありません。表現を簡単にしたり、何も追加したりしないでください。 – user31264

+0

Morton氏は私の答えに否定的なコメントを追加しようとしているだけです。この男は私の答えにとても活発で、おそらく私に対して何かを持っています。 – user31264

関連する問題