sed は # で始まるが # で始まらない行を削除します。 (シェルスクリプト)

sed は # で始まるが # で始まらない行を削除します。 (シェルスクリプト)

を使用して行を削除するには、#次の行を使用できます。

sed -i "/^\(\\s\)*\\#/d"

しかし、私が望むのは、#代わりにで始まる行を削除することです#!

答え1

sed -i -e '/^\s*#\([^!]\|$\)/d'

どこ:

  • ^行の始まり
  • \s*ゼロ個以上の空白文字
  • #ハッシュマーク
  • \([^!]\|$\)! その後に行の終わり以外の文字が続きます。

答え2

sed -i -e '/^#!/p' -e '/^#/d' file

これは、ファイルを1行ずつ繰り返し、その行で始まる行を見つけると、#!最初の式が印刷されます。その後、2番目の式によってパターンスペースから削除されます(つまり、印刷されません)。第二時間は、p使用しないときに適用される基本コマンドによって実行されますsed -n

just で始まる行は#最初の式では無視されますが、2 番目の式では削除されます。

他の行はp基本コマンドで印刷されます。

先行スペースを許可し、#次の行を削除します。

sed -i -e '/^[[:blank:]]*#!/p' -e '/^[[:blank:]]*#/d' file

この[[:blank:]]式はスペースまたはタブと一致します。


コメントでStéphaneが述べたように、最初の式からに変更すると、2番目のp式が一致する場合、2番目の式に関係なく、スクリプトは次の入力行を引き続き使用できます。このコマンドは事前定義されたラベルに分岐するか、ラベルが指定されていない場合はスクリプトの末尾に分岐します。これは最適化になります。bsedbsed

答え3

到着「そして」コマンドグループ({...;})が必要な2つのアドレス:

sed '/^[[:space:]]*#/{/^#!/!d;}' < file

GNUを使用すると、内部で使用し(最新バージョンと仮定)、交換および省略できますsed-i[[:space:]]\s;

sed -i '/^\s*#/{/^#!/!d}' file

複数をネストできますが}CとDではなく、AとB、それは:

sed '/A/{/B/{/C/!{/D/!d;}' -e '}' -e '}' < file

または:

sed '
  /A/{
    /B/{
      /C/!{
        /D/!d
      }
    }
  }' < file

答え4

概要:Shebang以外のコメントをすべて削除してください。

sed -e '1{/^\s*\#/{/^\#!/!d}}' -e '1!{/^\s*\#/d}' file

\\一重引用符(二重引用符なし)を使用するようにコマンドを変更します。

sed '/^\(\s\)*\#/d'

詳細(#の後にはアスタリスク[^!] sed '/^\(\s\)*\#[^!]/d'. But that will fail with a line that is empty after the comment (#ではない項目が必要です)文字を追加するだけでほとんど機能します。

これを行うには、行が終わったことをアサーションする必要があります($)。

これを行うには、拡張構文を使用する必要があります([^!]|$)

sed -E '/^\s*\#([^!]|$)/d'

または、より携帯性に優れています。

sed -E '/^[ \t]*\#([^!]|$)/d'

しかし、スクリプトの場合、最初の最初の行だけが#!重要です。
オプションのスペースと # で始まるその他の行はすべてコメントです。

sed -e '1{/^#!/!d}' -e '1!{/^[ \t]*#/d}' file

意味は次のとおりです

最初-e

最初の行はコメント(スペースと#)で始まりますが、正確に#ではない場合は削除されます。

第二-e

1!オプションのスペースと#()で始まる他の行を削​​除します。

関連情報