Apakah mungkin melakukannya dalam satu liner?
Saya memiliki output seperti ini:
"First line" - Description
" Second line" - Description
"Third line" - Description
" Fourth line" - Description
Input ini dihasilkan secara otomatis.
Saya ingin mengganti kemunculan pertama "
(tanda kutip + spasi) dengan "
(tanda kutip) untuk setiap baris. Jika saya menerapkan substitusi secara global, itu juga akan mengubah setiap kejadian line" -
menjadi line"-
, jadi saya bertanya-tanya apakah mungkin menggunakan sed one liner untuk melakukannya.
Saya sudah mencoba menggunakan ^
seperti ini
sed -r ':a;N;$!ba;s/(\^\" )/\"/g'
Tapi itu tidak berfungsi, itu tidak menggantikan apa pun. Saya mencoba
sed -r ':a;N;$!ba;s/(^|\" )/\"/g'
dan itu menggantikan semua kejadian. Saya baru saja mulai menggunakan sed, jadi saya tidak benar-benar tahu jika saya melakukan sesuatu yang salah.
Apa yang kulewatkan di sini?
sed
regular-expression
Steve B.
sumber
sumber
sed
, tetapi untuk portabilitas dan untuk menghindari kesalahan yang sangat aneh, Anda harus mengakhiri argumen perintah yang diberikan setelah label (jika Anda memerlukannya sama sekali). Misalnya,sed -e ':a' -e 'N;$!ba' -e 'whatever'
Jawaban:
Anda terlalu memikirkannya.
sed
hanya mengganti instance pertama pada sebuah baris secara default (tanpa/g
pengubah), meskipun Anda masih ingin berlabuh karena Anda tidak; sangat ingin instance pertama dalam baris sebagai yang di awal baris; dan Anda biasanya tidak memerlukan tindakan garis eksplisit yang Anda coba gunakan (mengapa?).sumber
sed
perintah sepertiN
dan label seperti:a
tidak usang sama sekali dan mereka yang portabel dan POSIX ditentukan , tidak seperti Perl / Python / Ruby / apapun. Namun benar bahwa jika Anda sering membutuhkannya , Anda harus belajarawk
.Jawaban yang lebih umum, karena saya tidak dapat mengomentari jawaban geekosaur - Anda tidak akan menaruh ^ (awal jangkar baris). Misalnya, jika Anda ingin mengganti kemunculan pertama A dengan B, Anda harus melakukannya
sumber