sed: ``1{/^$/d}'' を使う正規表現は何をしますか?

sed: ``1{/^$/d}'' を使う正規表現は何をしますか?

シェルスクリプトを見ている間、私は次の行を見つけました。

sed '1{/^$/d}' $file1 >> $file2

ここでのポイントは何ですかsed '1{/^$/d}'

答え1

1行が空の場合は削除してください。

  • 1{- 1号線にある場合
  • /^$/- これは空行です。
  • d- ライン削除
  • }- 条件終了

以下の例

$ cat x1

Hello
World
$ sed '1{/^$/d}' x1 >x2
$ cat x2
Hello
World
$

答え2

GNUsed

1{/^$/d}

どちらが書き込みに移植性が良いですか?

1{/^$/d;}

または

1 {
    /^$/ d
}

2つの部分に分けられます:

  1. 1 {...}
  2. /^$/ d

現在の行が入力の最初の行である場合、最初の部分は中括弧内でコマンドを実行します。

d現在行が空の場合、つまり行の先頭^の後に行の終わりがある場合、$2番目の部分はコマンドをトリガーします。このdコマンドは現在の入力を破棄し、次のループをただちに開始します。つまり、次の入力行にジャンプし、最初から式を評価します。

1/^$/両方住所後続のコマンドが適用される行に影響します。

つまり、sed入力の最初の行が空の場合、コマンドは他の空行を削除せずにその行を削除します。

表現方式

/^$/ { 1 d; }

同じことを行いますが、sedすべての入力行で正規表現のマッチングを実行する必要があるため、コストがかかります(入力サイズが大きく、コンピュータが非常に遅くない場合は違いを感じる可能性があるかどうか疑問です)。


それ以外にも、コマンドで変数を引用する必要がある可能性が高く、何があるのか​​わからないので、$file1コマンドが誤ってダッシュで始まる値をオプションのセットとして解釈するのを防ぐことをお勧めします。

sed -- '1 { /^$/ d; }' "$file1" >>"$file2"

または、

sed -e '1 { /^$/ d; }' -- "$file1" >>"$file2"

またはsed標準入力から読む場合、

sed '1 { /^$/ d; }' <"$file1" >>"$file2"

また、見ることができます

関連情報