-Eを使用し、複数の-eを使用しない場合にGNU sedに複数の式を提供する方法は?

-Eを使用し、複数の-eを使用しない場合にGNU sedに複数の式を提供する方法は?

次のファイルがありますbitcoin.conf

#Bind to given address and always listen on it (comment out when not using as a wallet):
#bind=127.0.0.1
daemon=1
#debug=i2p
debug=tor
#Pre-generate this many public/private key pairs, so wallet backups will be valid for
# both prior transactions and several dozen future transactions
keypool=2
#i2pacceptincoming=1

#i2psam=127.0.0.1:8060
#Make outgoing connections only to .onion addresses. Incoming connections are not affected by this option:
onlynet=i2p
onlynet=onion
#running Bitcoin Core behind a Tor proxy i.e. SOCKS5 proxy:
proxy=127.0.0.1:9050

次の質問に対する回答を調べた後これは尋ねる価値がある質問です#、数行のコメントを付けるように設計されたスクリプトでソリューションを実装しようとしています。

#!/usr/bin/bash

#Semicolons do not seem to work below.
#This gives me no error but it does not do anything 
#sed -Ee 's/^\(debug=tor\)/#\\1/;s/^\(onlynet=onion\)/#\\1/;s/^\(proxy=127\)/#\\1/' bitcoin.conf

#This works fine
sed -Ee s/^\(debug=tor\)/#\\1/ -e s/^\(onlynet=onion\)/#\\1/ -e s/^\(proxy=127\)/#\\1/ bitcoin.conf 

#When grouping, and therefore extended regexp, is not applied semicolons seem to work fine
sed -e 's/^debug=tor/#debug=tor/;s/^onlynet=onion/#onlynet=onion/;s/^proxy=127/#proxy=127/' bitcoin.conf 


##This gives me no error but it doesn't do anything
#sed -Ee 's/^\(debug=tor\)/#\\1/
#  s/^\(onlynet=onion\)/#\\1/ 
#  s/^\(proxy=127\)/#\\1/' bitcoin.conf 




#sed -i  -E -e 's/^\(debug=tor\)/#\\1/' -e 's/^\(onlynet=onion\)/#\\1/' -e 's/^\(proxy=127\)/#\\1/' \
#-e 's/^\(addnode\)/#\\1/' -e 's/^\(seednode\)/#\\1/' bitcoin.conf #does not comment out anything

-EGNUに複数の式を入力するときにセミコロンと改行文字が機能しないのはなぜですかsed

sedPS作品の仕方が異なるため、-Eこの質問は上記の質問と重複した質問ではないようです。

ベストアンサー1

問題は、拡張機能を有効にするためにフラグを追加するがERE構文BREを使用することです。フラグを削除しても戻り参照もエスケープするので、対応する行は1

$ sed -Ee 's/^\(debug=tor\)/#\\1/;s/^\(onlynet=onion\)/#\\1/;s/^\(proxy=127\)/#\\1/'

上記のコードは角かっこをエスケープしてリテラルにします。一致するものがないので何も変わりませんでした。

$ sed -Ee s/^\(debug=tor\)/#\\1/ -e s/^\(onlynet=onion\)/#\\1/ -e s/^\(proxy=127\)/#\\1/

によって追加されましたエドモートン- スクリプトを引用しないことで(悪い考えです!)sedが見る前に解釈のためにシェルに公開されるので、シェルはすべての先行バックスラッシュを消費するのでsedが見るのはs/^(debug=tor)/#\1/ -e s/^(onlynet=onion)/#\1/ -e s/^(proxy=127)/#\1/

あなたの質問に答えるために複数のコマンドにセミコロンを使用すると、最初の試みに示されているようにフラグで動作しますが、-E一致するものはありません。以下は実際の例です。

$ sed -E 's/^(debug=tor)/#\1/;s/^(onlynet=onion)/#\1/;s/^(proxy=127)/#\1/'

&ただし、除外された項目がないため、戻り一致を使用することもできるため、グループ一致は重複します。逆参照やメタ文字を使用しないため、実際に拡張機能は必要ありません。

$ sed 's/^debug=tor/#&/;s/^onlynet=onion/#&/;s/^proxy=127/#&/'

またはより良いかもしれません - さんが追加しましたエドモートン

$ sed -E 's/^(debug=tor|onlynet=onion|proxy=127)$/#&/'

おすすめ記事