ファイル内の行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2002 -j ACCEPT
コメントアウトするには、次の行を
2001
私は単にこのSEDコマンドを実行できます:
sed -i '/ 2001 /s/^/#/' file
しかし、今、どのように元に戻すのですか?
同じ行のコメントを外しますか?
私は試した
sed -i '/ 2001 /s/^//' file
それは機能しません。
このsed
コマンドを試してください。
sed -i '/^#.* 2001 /s/^#//' file
はい、特定の文字列を含む行をsedでコメントするには、次のようにします。
sed -i '/<pattern>/s/^/#/g' file
そしてコメント解除するには:
sed -i '/<pattern>/s/^#//g' file
あなたの場合:
sed -i '/2001/s/^/#/g' file (to comment out)
sed -i '/2001/s/^#//g' file (to uncomment)
最後のオプション「g」はグローバルな変更を意味します。パターンの1つのインスタンスのみを変更する場合は、これをスキップしてください。
@ Avinash Rajの有用な回答 をより一般的な、POSIX準拠ソリューションで補完します。
ソリューションはawk
- basedであることに注意してください。これは、sed
を使用した堅牢な portable ソリューションは、 POSIX ' basic 正規表現。
awk -v commentId='#' -v Word='2001' '
$0 ~ "(^|[[:punct:][:space:]])" Word "($|[[:punct:][:space:]])" {
if (match($0, "^[[:space:]]*" commentId))
$0 = substr($0, RSTART + RLENGTH)
else
$0 = commentId $0
}
{ print }
' file > tmpfile.$$ && mv tmpfile.$$ file
(^|[[:punct:][:space:]])
および($|[[:punct:][:space:]])
は、他の正規表現方言で知られている\<
および\>
ワード境界アサーションに相当するPOSIX拡張正規表現です。awk
はインプレース更新を提供しません(偶然にもPOSIX sed
も提供しません)。したがって、出力はまず一時ファイルにキャプチャされ、成功すると元のファイルと置き換えられます。標準のsedパラメータをサポートしていないmacの場合、これはハッシュタグを削除します
sed -i "" "/.*#.*d\/docker-php-ext-xdebug\.ini.*/s/^#//g" docker-compose.yml
ファイル内の行をコメント化およびコメント解除する方法の簡単な例。
サンプルファイル:
umask 027
TMOUT=600
ファイルをバックアップして(笑うためだけに)コメントアウトしてコメントを外しましょう:
# backup file (because we should always do this)
cp /etc/bash.bashrc /etc/bash.bashrc.$(date '+%Y-%m-%d,%H:%M:%S')
# original: TMOUT=600 , result :# TMOUT=600
sed -i '/[^#]/ s/\(^TMOUT=600.*$\)/#\ \1/' /etc/bash.bashrc
# original # TMOUT=600 ,result :TMOUT=600
sed -i '/^#.*TMOUT=600.*$/s/^#\ //' /etc/bash.bashrc