行を削除するSedコマンド - 変数

行を削除するSedコマンド - 変数

sedコマンドを使用して、合計99行のファイルから3行目をすべて削除したいと思います。最初の3行を保持し、最後の3行を削除する式に進みます。

私の起動スクリプトは次のとおりです。

for i in `seq 1 6 99`; do
   sed '$i,${i+2}!d' test.txt > o$i.txt
done
cat o*.txt > O.txt
rm o*.txt

個人的に良い仕事をしていて好きです。

sed '1,3!d' test.txt > o1.txt
sed '7,9!d' test.txt > o7.txt
...

しかし、sedでは動作しません。何が間違っているのか教えてもらえますか?ありがとう

ベストアンサー1

で提案したようにコメント、sed呼び出しで変数を正しく引用する必要があります。

for i in $(seq 1 6 99); do
    sed "$i"','"$((i+2))"'!d' test.txt > "o$i.txt"
done

変数は一重引用符で拡張されず、文字通り使用されます($i=最後の行の前に挿入されます)。二重引用符(この例では引用符は機能しません)を使用して拡張するには、$((…))算術評価を実行して結果を出力する必要があります。スクリプトの残りの部分は一重引用符で囲まれています。

$(…)また、廃止された逆引用符の代わりに、コマンド置換のために更新された構文を使用する必要があります`…`。これにより、引用が簡単になります。ここに一つあります。良い例


sedしかし、GNUを使うことができます第一歩〜第一歩ループの代わりに演算子:

sed '4~6{N;N;d}' file

例:

$ seq 20 | sed '4~6{N;N;d}'
1
2
3
7
8
9
13
14
15
19
20

説明する:

sed '4~6d'4行が削除され、6行が10、16、22 ...

{N;N;d}残りの2行(4、5、6、10、11、12)を削除します。

おすすめ記事