1

test-domain という名前のファイルがあり、その内容には100.amという行が含まれています。

これを行うと、予想どおり、100.am の行が test-domain ファイルから削除されます。

for x in $(echo 100.am); do sed -i "/$x/d" test-domain; done

ただし、echo 100.amの代わりに、undedred -lines という名前のファイルから各行を読み取ると、機能しません。

for x in $(cat unwanted-lines); do sed -i "/$x/d" test-domain; done

これは、不要な行の内容が100.amの正確な内容を持つ 1 行だけであっても同様です。

変数でechoを使用すると sed delete line が機能するのに、 catを使用すると機能しない理由を誰かが知っていますか?

4

4 に答える 4

1

変数でechoを使用するとsed delete lineが機能するのに、catを使用すると機能しない理由を誰かが知っていますか?

不要な行を含むファイルにCR+LFは、ファイルを使用するときに機能しない行末が含まれていると思います。ループ内で CR を取り除くことができます。

for x in $(cat unwanted-lines); do x="${x//$'\r'}"; sed -i "/$x/d" test-domain; done
于 2013-11-11T13:18:11.620 に答える
1

あなたの戦略よりも優れた戦略の 1 つは、次のように、正規のエディターを使用することですed

ed -s test-domain < <(
    shopt -s extglob
    while IFS= read -r l; do
        [[ $l = *([[:space:]]) ]] && continue
        l=${l//./\\.}
        echo "g/$l/d"
    done < unwanted-lines
    echo "wq"
)

警告。の正規表現やコマンドと競合unwanted-linesする可能性のある文字がファイルに含まれていないことを確認する必要があります。既にピリオドの一致を含めています (つまり、でed置き換えます)。.\.

sedで何度もフォークしたり、一時ファイルを書き込んだり、名前を変更したりする必要がないため、この方法は非常に効率的です。

別の可能性として を使用することもできますが、その場合は編集オプションが提供grepされません。ed

述べる。 ed標準のエディタです。

于 2013-11-11T13:20:22.410 に答える