の仕事ですsed
!あなたはより速く、より簡単に見つけることができません:
2 つの値に確信がある場合は、次のように簡単に実行できます。
sed -e '1{/^131$/d};${/^0$/d}' -i mybrokenfile
ただし、次のコマンドsed
を使用すると、数字のみを含む最初および/または最後の行が削除されます。
sed -e '1{/^[0-9]\+$/d};${/^[0-9]\+$/d}'
これは、ファイルを param として実行し、バックアップ ファイルを自動生成することで実行できます。
sed -e '1{/^[0-9]\+$/d};${/^[0-9]\+$/d}' -i.bak files*
説明:
- 2 つの部分があり、
1
最初の行と最後の行のアドレスです。$
1
$
- 次のブロックは、条件付きアドレスの別の形式を示しています。つまり、 と
/^[0-9]\+$/
の間の 1 つまたは複数の文字で始まり、その直後で終わる * 行を意味します。0
9
- この一致する行 (最初または最後の行) で、実行するコマンドは
d
delete lineです。
これは次のように記述できます。
sed -e '1{
/^[0-9]\+$/d
}
${
/^[0-9]\+$/d
}' -i.bak files*
同じように。
編集:
私は何度も書くのが嫌いなので...おおよそ何でも;
ちょっとトリッキーなことをする方法がありますが、最初と最後の行だけです。
まず、同じサンプルを次のように記述できます。
sed -e '1ba;$ba;bb;:a;/^[0-9]\+$/d;:b;' -i.bak files*
したがって、これは1バイト短くなります。しかし、特に操作は一度だけ書かれています:
説明:
:a
と:b
は分岐 (ジャンプ) 先のラベルです
ba
とはそれぞれとbb
に分岐命令です。:a
:b
1
および$
アドレスは前述のとおりです
/.../d
も以前に説明されていますが、正規表現に一致する行を削除することを意味します
そして、次のように書くことができます:
sed -e '
1ba;
$ba;
bb;
:a;
/^[0-9]\+$/d;
:b;
' -i.bak files*
s/../../
only の代わりに使用するアプリケーションのサンプルd
: 1 行目または最後の行にある場合にのみバージョン情報を変更します。
sed -e '1ba;$ba;bb;:a;s/\(Id: .*,v\).*\(Exp\)/\1'"$(
date +" $VER %F %T $USER ")"'\2/;b;' -i files*