sed bash 変数はファイルから 1 行を削除します。

sed bash 変数はファイルから 1 行を削除します。

ファイル内で特定の操作を実行しようとしていますが、1にインデックスを定義し、1行ずつ操作を実行してファイル行の内容を削除しようとしていますが、sed -i -e "{a}d"問題は1行ずつ行をダウンロードするようです。たとえば、ファイルに

1
2
3
4
5

結果は2 3 5なので、1と4のみがダウンロードされます。私は何が間違っていましたか?

#!/usr/bin/bash
a=0
filename="$1"
while read -r line; do
    echo $a
    name="$line"
    Operation
    sed -i -e "${a}d" $1
    let a+=1
done < "$filename"

コメントの中で:私がやりたいことは次のとおりです。

  • 現在の行をエコーし​​ます。
  • ファイルに対する操作の実行(この場合はwget)
  • 今ダウンロードした行を削除してください。
  • 現在の行を追加
  • これ以上行がなくなるまで

答え1

選択したプログラムが正しくありません。

想定される値はa次から始まります1a=1

filenameスクリプトがonlineを読み取ると、done<"$filename"ファイルの内容(その時点の内容)が読み取られます。その後、同じファイルを変更します。所定の位置に行(最初の行と仮定)を削除すると、次の読み取りは2番目の元の行(現在のファイルの最初の行)を使用しますが、現在のファイル(現在の3番目の行)から行インデックス2を削除します。その他など

何が起こるかを確認するには、次のスクリプトを実行します。

#!/usr/bin/bash
a=1
filename=infile
seq 5 >"$filename"

while read -r line; do
    echo "Read line $line for index $a"
    echo "Will remove line $(sed "${a}!d" "$filename")"
    sed -ie "${a}d" "$filename"
    echo;echo next
    let a+=1
done < "$filename"

これを行うことができます:

$ ./script
Read line 1 for index 1
Will remove line 1

next
Read line 2 for index 2
Will remove line 3

next
Read line 3 for index 3
Will remove line 5

next
Read line 4 for index 4
Will remove line 

next
Read line 5 for index 5
Will remove line 

next

ご覧のとおり、1、3、5行が削除されました。

正しいアプローチ:2つのうちの1つ

  • 終わりから始める
  • 添付ファイルにインデックスを保存する
  • または、ファイルが空になるまで、ファイルの最初の行に対してのみプロセスを再起動します。

すでに知っているツールを使用して3番目のオプションを実装してください。

#!/usr/bin/bash

filename=infile
seq 5 >"$filename"

while [[ -s "$filename" ]]; do
    name=$(head -n1 "$filename")
    echo wget "$name"
    sed -i '1d' "$filename"
done

答え2

IMHO、読んでいるファイルを編集するのは危険です。別のソリューションを提案してみましょう。

  • urls.lst入力リストを1行ずつ読みます()
  • wgetURL
  • 正常に2番目のファイル(received.lst)にURLを追加すると、

プロセスが中断され、まだ取得されていないURLのリストから再起動する場合は、次の方法でリストを取得できます。

diff --new-line-format="" --unchanged-line-format=""  urls.lst received.lst

関連情報