web-dev-qa-db-ja.com

Sedを使用して特定の文字列を含む行のコメントを解除するにはどうすればよいですか?

ファイル内の行:

-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

それは機能しません。

42
user3864928

このsedコマンドを試してください。

sed -i '/^#.* 2001 /s/^#//' file
46
Avinash Raj

はい、特定の文字列を含む行を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つのインスタンスのみを変更する場合は、これをスキップしてください。

75
JNLK

@ Avinash Rajの有用な回答より一般的なPOSIX準拠ソリューションで補完します。

  • Toggles 行のコメント一致する指定可能な文字列発生する必要がある個別のWordとしてこの線。
  • コメント文字(文字列)も指定可能なです。

ソリューションは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拡張正規表現です。
  • 空白 after コメント文字は保持されますが、その前は保持されません。
  • コメント文字を行の先頭に追加する場合、空白なしで直接追加されます。
  • したがって、 this ソリューションでのみコメントを切り替える場合、すべての空白が保持されます。
  • POSIX awkはインプレース更新を提供しません(偶然にもPOSIX sedも提供しません)。したがって、出力はまず一時ファイルにキャプチャされ、成功すると元のファイルと置き換えられます。
6
mklement0

標準のsedパラメータをサポートしていないmacの場合、これはハッシュタグを削除します

sed -i "" "/.*#.*d\/docker-php-ext-xdebug\.ini.*/s/^#//g" docker-compose.yml
0
max4ever

ファイル内の行をコメント化およびコメント解除する方法の簡単な例。

サンプルファイル:

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
0
Mike Q