を使用して行を削除するには、#
次の行を使用できます。
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番目の式に関係なく、スクリプトは次の入力行を引き続き使用できます。このコマンドは事前定義されたラベルに分岐するか、ラベルが指定されていない場合はスクリプトの末尾に分岐します。これは最適化になります。b
sed
b
sed
答え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!
オプションのスペースと#()で始まる他の行を削除します。