linux - Mengenai penggunaan bercampur semasa membaca dan sed, sed memakan baris pertama input standard
習慣沉默
習慣沉默 2017-06-10 09:48:43
0
1
1094

Terdapat fail crashcourse_test.txt dengan kandungan berikut:

# cat crashcourse_test.txt 
1001|Anvils R Us|123 Main Street|Southfield|MI|48075|USA
1002|LT Supplies|500 Park Street|Anytown|OH|44333|USA
1003|ACME|555 High Street|Los Angeles|CA|90046|USA
1004|Furball Inc.|1000 5th Avenue|New York|NY|11111|USA
1005|Jet Set|42 Galaxy Road|London|NULL|N16 6PS|England
1006|Jouets Et Ours|1 Rue Amusement|Paris|NULL|45678|France
# 

Kandungan skrip while_read.sh adalah seperti berikut Tujuannya adalah untuk menggunakan kandungan fail di atas sebagai input standard, masukkannya ke dalam gelung baca sambil, dan gantikan rentetan "USA" dalam setiap baris dengan "XXXXXXXXX" melalui arahan sed:

#!/bin/bash

while read line
do
        sed 's/USA/XXXXXXXXX/'
done < crashcourse_test.txt

Hasil keluarannya ialah:

# ./while_read.sh 
1002|LT Supplies|500 Park Street|Anytown|OH|44333|XXXXXXXXX
1003|ACME|555 High Street|Los Angeles|CA|90046|XXXXXXXXX
1004|Furball Inc.|1000 5th Avenue|New York|NY|11111|XXXXXXXXX
1005|Jet Set|42 Galaxy Road|London|NULL|N16 6PS|England
1006|Jouets Et Ours|1 Rue Amusement|Paris|NULL|45678|France
# 

Anda dapat melihat bahawa baris 1001 mengandungi rentetan "USA" (yang kebetulan merupakan baris pertama dalam fail), yang memenuhi keperluan penggantian, tetapi hasilnya ialah baris ini bukan keluaran.
Saya tahu cara untuk mengeluarkannya dengan betul, yang boleh dicapai menggunakan echo $line | sed 's/USA/XXXXXXXXX/'.
Tetapi saya ingin tahu sebab mengapa hanya baris pertama keluaran yang terlepas. Ke manakah perginya baris pertama selepas memasukkan while dibaca sebagai input standard?

習慣沉默
習慣沉默

membalas semua(1)
淡淡烟草味

Pertama sekali, penggunaan sed anda mungkin salah.

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

Parameternya ialah fail, pembolehubah anda line tidak digunakan

while read line
do
    echo 3
    sed 's/USA/XXXXXXX/'
done < crashcourse_test.txt

输出:
3
1002|LT Supplies|500 Park Street|Anytown|OH|44333|XXXXXXX
1003|ACME|555 High Street|Los Angeles|CA|90046|XXXXXXX
1004|Furball Inc.|1000 5th Avenue|New York|NY|11111|XXXXXXX
1005|Jet Set|42 Galaxy Road|London|NULL|N16 6PS|England
1006|Jouets Et Ours|1 Rue Amusement|Paris|NULL|45678|France

Daripada hanya mengeluarkan 3, ini bermakna gelung hanya dilaksanakan 1 kali Jadi pengalihan fail anda < crashcourse_test.txt sebenarnya digunakan sebagai input read dan < crashcourse_test.txt实际上被作为read的输入和sed的输入,并且sedread input, dan

gunakan semuanya selepas baca sebagai input, jadi anda tidak menggunakan baris pertama input.🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan