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)を削除します。