
次の内容のファイルがあります:
[root@server list]# cat filenames.txt
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB]
[root@qa4app01 list]#
私はこれを Python スクリプトで使用するリストとして使いたいので、を にAAA'
、'AAA'
をに変更しようとしています。また、とを と に置き換えようと考えています。'BBB
'BBB'
sed
[
['
]
']
確認するために、これを試しました:
[root@server list]# cat filenames.txt | sed "s/]/']/g"
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB']
[root@server list]#
]
うまくいき、を に置き換えることができました']
。 そのため、AAA
を sed 内の右角括弧と一重引用符を左角括弧に置き換えるだけで済み、これを試しました。
[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/[/['/g"
sed: -e expression #2, char 8: unterminated `s' command
[root@server list]#
sed
わかりました。何らかの理由でコマンドの追加が正しく機能していないと思ったので、これを確認するためにsed
、左の角括弧を個別に試しました。
[root@server list]# cat filenames.txt | sed "s/[/['/g"
sed: -e expression #1, char 8: unterminated `s' command
[root@server list]#
奇妙ですね。 は左括弧と角括弧を別々に扱っているようですsed
。 をエスケープしなくてもうまくいきました[
が、はエスケープ文字なしsed
では動作し]
ません。 最終的には、以下のように左角括弧にエスケープ文字を追加することで、目的のものを手に入れました。
[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/\[/\['/g" ['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB'] [root@server list]#
私は現在、両方の角括弧が多数含まれるファイルを処理する Python + シェル スクリプトを作成中です。私の質問は、右角括弧と左角括弧がsed
または によって異なる方法で処理されるかどうかですbash
。
sed バージョンは GNU sed バージョン 4.2.1 です。
PS: 安全のために両方の括弧でエスケープ文字を使用することにしましたが、右角括弧のみで作業する場所でエスケープ文字を使用しない場合 (読みやすさのため)、スクリプトが壊れないことを絶対に確認したいのです。]
答え1
[
を紹介します文字クラスそして]
それを閉じます。
sed が (つまり終了コマンドだけを見た場合]
は) 問題ありません。sed はこれが特別なコマンドではないと想定します。
のみ[
(閉じ なし]
)を使用すると が混乱するsed
ため、エスケープする必要があります。
ちなみに、
g
(グローバル) フラグ (1 行につき 1 つの置換のみ)[
代わりに脱出する。
私はあなたの変更を管理しました
sed -e "s/]/']/" -e "s/\[/['/"
答え2
Archemar は、これが で失敗した理由を説明しました[
が、この特定の置換を行う別の方法を次に示します。
$ sed "s/^./['/;s/.$/']/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']
または、&
which を使用すると、「今一致したもの」という意味になります。
$ sed "s/^./&'/;s/.$/'&/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']