Saya mencoba mencari cara untuk mereplikasi satu rentang baris dalam file teks. Rentang dimulai dengan baris yang unik dalam file tetapi rentang diakhiri dengan baris yang dapat ada di beberapa tempat dalam file.
Berikut beberapa contoh input yang perlu saya proses:
I have no imagination so this sample text will Common be boring. But it does demonstrate the problem I am trying to solve. Common Hi mom! This is a unique line. And here is some more text that should be copied as well. Common Followed by text that should not be copied.
Baris yang perlu saya duplikat dan ubah dicetak tebal untuk menunjukkannya di sini.
Output yang saya butuhkan adalah:
I have no imagination so this sample text will Common be boring. But it does demonstrate the problem I am trying to solve. Common Hi mom! This is a changed line. And here is different more text that should be copied as well. Common This is a unique line. And here is some more text that should be copied as well. Common Followed by text that should not be copied.
Keluaran tambahan dicetak tebal untuk memperjelas.
Saya perlu mendapatkan rentang garis yang dimulai dengan baris:
This is a unique line
dan diakhiri dengan baris:
Common
Rentang garis itu harus dimasukkan sebelum tepat sebelum rentang garis asli. Salinan rentang garis yang cocok perlu sedikit dimodifikasi.
Baris "Umum" yang mengakhiri rentang itu sendiri dapat muncul di banyak tempat di dalam file.
Saya menemukan awk
. yang berfungsi skrip tetapi tampaknya jauh lebih rumit daripada yang seharusnya. awk
saya keterampilan tidak ada.
/This is a unique line/{flag=1}
/Common/{
if (flag > 0) {
n=m;
sub("some","different",n);
sub("unique","changed",n);
print n "\n" $0 "\n" m;
m=""
};
flag=0
};
flag{
if (length(m) > 0) {
m=m "\n" $0
} else {
m=$0
}
}
!flag{ print }
Apakah ada cara yang lebih bersih dan tidak terlalu bertele-tele untuk mengimplementasikan ini? Saya terbuka untuk opsi lain selain awk
. Itu hanya perlu menjadi perintah standar yang tersedia di macOS.
Jawaban yang Diterima:
awk '/This is a unique line/,/Common/{
H = H RS $0
if ( $0 ~ /Common/ ) {
g = H
sub("\n","",g)
sub("some","different",g)
sub("unique","changed",g)
$0 = g H
} else { next }
}1' inputfile
Berikut sed
kode (saya tunjukkan di bagian Jawaban) diterjemahkan ke dalam awk
.
Perhatikan bahwa, kode yang Anda miliki, Anda bertanggung jawab untuk MENGAKTIFKAN/MENONAKTIFKAN awk
bendera variabel untuk melacak garis. Padahal, awk
sudah melakukannya untuk Anda di bawah tenda hal yang sama persis ketika Anda menggunakannya range
operator ,