Saya telah diberitahu bahwa itu mungkin, tetapi tanpa satu contoh kerja, yang sed
dapat membaca dari variabel string tanpa memerlukan file input. Saya belum membuatnya bekerja. Untuk keselamatan umum, saya menulis $PATH
variabel ke variabel lain, karena saya mengacaukan ini, karena saya tidak perlu masalah lain untuk muncul sampai saya tahu persis bagaimana melakukan ini.
Pertimbangkan yang berikut ini:
~$x=$PATH
~$sed -i 's/:/ /g' $x
ini gagal dengan: Tidak ada file atau direktori tersebut.
Berikut beberapa yang sudah saya coba:
~$ sed -i 's/:/ /g' | (read x)
sed: no input files
~$ sed -i 's/:/ /g' | (read $x)
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' | $(read x)
sed: no input files
~$ sed -i 's/:/ /g' | $(read $x)
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' < $(read $x)
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
bash: $(read $x): ambiguous redirect
~$ sed -i 's/:/ /g' < read $x
bash: read: No such file or directory
~$ sed -i 's/:/ /g' < (read x)
bash: syntax error near unexpected token `('
~$ sed -i 's/:/ /g' < $((read x))
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: syntax error: operand expected (error token is "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' < $((read $x))
bash: read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: division by 0 (error token is "usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' << $((read $x))
> ;^C
~$ sed -i 's/:/ /g' << $(read $x)
> ;^C
~$ sed -i 's/:/ /g' $x
sed: can't read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < $x
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < echo $x
bash: echo: No such file or directory
~$ sed -i 's/:/ /g' | echo $x
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
sed: no input files
Bisakah ini bekerja? Saya lebih suka tidak perlu menulis file yang saya tidak perlu supaya saya bisa menggunakan sed. Untuk contoh khusus ini, jika ~$x=$PATH ~$sed -i 's/:/ /g' $x
benar-benar bekerja seperti yang saya harapkan, saya akan mendapatkan:
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games
yang kemudian saya dapat tetapkan ke variabel, dan gunakan dalam perintah di masa depan, seperti ls $x
x=$(echo "$x" | sed 's/:/ /g')
?Jawaban:
Mungkin:
sumber
sed
sini tidak bekerja pada "variabel string" (?), tetapi pada input standar --- yang seharusnya.sed
, itu adalah pertanyaan tentang bagaimana shell mengarahkan ulang input.sed
berurusan dengan aliran input dan membacanya melalui input standarnya. Apakah itu file atau tidak, tidak relevan. Ia dapat menerima apa saja asalkan melalui input standar.Ini tidak ada hubungannya dengan
sed
itu, itu berlaku untuk setiap program yang membaca input standar. Bagaimanapun, apa yang Anda cari adalahTidak ada alasan untuk menyimpan dalam variabel lain, tidak ada yang Anda lakukan dengan cara ini akan memengaruhi nilai yang disimpan dalam variabel. Anda memerlukan operator penugasan (
=
) untuk itu. Sintaks yang digunakan di atas disebut "di sini string" dan khusus untuk bash, ksh dan zsh. Ini berfungsi untuk melewatkan nilai variabel sebagai input ke program yang membaca dari input standar.Saya telah menulis jawaban pada U&L yang mencantumkan semua berbagai operator shell seperti ini. Anda mungkin ingin melihatnya.
Perhatikan bahwa Anda juga bisa melakukannya
Akhirnya, Anda benar-benar tidak perlu
sed
sama sekali untuk ini. Anda dapat melakukan semuanya di bash secara langsung:Di atas adalah konstruksi pengganti bash. Diberikan variabel
$var
, pola,pat
dan pengganti (rep
), untuk mengganti semua kemunculanpat
denganrep
, Anda akan melakukannyaHal yang sama dengan garis miring hanya menggantikan kejadian pertama:
sumber