テキストファイルからバックスラッシュを削除する


10

私が持っています

入力:

 NISHA =\455  

出力:

 NISHA = 455

\出力から削除したい。コマンドを使用しようとしましたsed "s/[\]//g" Pが、機能せず、エラーのフラグが立てられます。

character found after backslash is not meaningful

3
あなたは非POSIX実装を持っているようですsed(またはおそらく非POSIXシェルからそのコマンドを実行していますか?)。必要はありませんがsedtr十分ですtr -d '\\' < P
ステファンChazelas

回答:


20

例の結果に示すように、円記号をスペースで置き換えることができます。

sed 's/\\/ /g'

または、コードに表示されているとおりに削除できます。

sed 's/\\//g'

特殊文字

バックスラッシュをエスケープしてその特別な意味を取り消すと、問題が発生する可能性があります。バックスラッシュは、シェルと正規表現の両方でエスケープするために使用される特殊文字です。

シェルのコマンドラインまたはスクリプトに入力するコマンドは、最初にシェルによって処理されます。シェルは、文字の特殊な意味とエスケープを解釈します。次に、結果がコマンドに渡されて(などsed)、文字の独自の解釈が実行されます。コマンドを作成するときの精神的な手順は逆です。最初に正規表現にエスケープを追加し、次にシェルにエスケープを追加します。

  1. 正規表現(などのコマンドへの入力)sedでは、grep円記号は次のように円記号でエスケープできます。\\また、[\]円記号は特別な意味を失うため、使用したようにset式を使用できます。

  2. シェル(などbashでは、バックスラッシュでバックスラッシュをエスケープできます。だから\書く代わりに\\。文字列を二重引用符で囲むと、"バックスラッシュの動作がより複雑になります<1>。文字列を一重引用符で囲むと、'を除くすべての文字が文字どおりに処理され'ます。

あなたが使用したい場合は、二重引用符を:あなたは、次のいずれかを使用することができます
sed "s/\\\\//g"エスケープ- \によって\シェルで、すべてを逃れ\、再び正規表現にします。実際、この場合、すべての特殊文字が適切にエスケープされるため、二重引用符は必要ありません。
sed "s/[\\]//g"-シェルではバックスラッシュでエスケープ\し、正規表現ではセットを使用します[ ]
sed "s/[\]//g"-はい、あなたの例はPOSIX準拠の環境で動作するはずです!二重引用符の間は、二重引用符\のコンテキストで特殊文字$`"\または改行の前にない限り、それ自体を表します。あなたの場合、シェルまたはのいずれかsedがPOSIX標準に従っていないようです。

では単一引用符また、あなたが使用されるような文字列や短い方法を使用することができます。
sed 's/[\]//g'
sed 's/\\//g'


6

バックスラッシュをエスケープする必要があります。これを試して:

sed 's/\\//g'

3

sedソリューションが必要ない場合は、次のコマンドを試してください。

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11


1
sed 's/\\//'

ほとんどの特殊文字で行うように、\前に配置し\ます。


g不明な理由でフラグを省略しました。これはコマンドの動作を変更しますが、そのような変更は質問では要求されませんでした。そうでなければ、あなたの返信は以前の返信と比較して何も新しいものをもたらしません。
pabouk 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.