Saya memang mencoba sed dan awk, tetapi tidak berfungsi karena karakter melibatkan "/" yang sudah ada di perintah sebagai pembatas.
Tolong beri tahu saya bagaimana saya bisa mencapai ini.
Di bawah ini adalah contoh Contoh. Kami ingin menghapus bagian komentar yaitu /*.....*/
/*This is to print the output
data*/
proc print data=sashelp.cars;
run;
/*Creating dataset*/
data abc;
set xyz;
run;
text-processing
Sharique Alam
sumber
sumber
INSERT INTO string_table VALUES('/*'), ('*/'), ('/**/');
)Jawaban:
Saya pikir saya menemukan solusi yang mudah!
BEBERAPA PEMBARUAN:
Kutipan dari ilkachu pengguna (teks asli dari komentar pengguna):
Saya bermain sedikit dengan opsi untuk gcc: -fpreprocessed akan menonaktifkan sebagian besar arahan dan ekspansi makro (kecuali #define dan #undef tampaknya). Menambahkan -dD akan meninggalkan definisi juga; dan std = c89 dapat digunakan untuk mengabaikan gaya baru // komentar. Bahkan dengan mereka, cpp menggantikan komentar dengan spasi (alih-alih menghapusnya), dan menciutkan spasi dan baris kosong.
Tapi saya pikir itu masih masuk akal dan solusi mudah untuk sebagian besar kasus, jika Anda menonaktifkan ekspansi makro dan hal-hal lain saya pikir Anda akan mendapatkan hasil yang baik ... - dan ya Anda dapat menggabungkannya dengan skrip shell untuk menjadi lebih baik ... dan banyak lagi...
sumber
cpp
akan melakukan lebih banyak daripada menghapus komentar (proses#include
, perluas makro, termasuk yang builtin ...)tail -n +7
hanya akan menghapus 7 baris pertama, itu tidak akan mencegah#include
pemrosesan atau ekspansi makro. Cobaecho __LINE__ | cpp
misalnya. Atauecho '#include /dev/zero' | cpp
-P
mode jika Anda melakukan ini. (Ini dapat menghilangkan kebutuhan untuk menggunakantail
.)-fpreprocessed
akan menonaktifkan sebagian besar arahan dan ekspansi makro (kecuali#define
dan#undef
ternyata). Menambahkan-dD
akan meninggalkan definisi juga; danstd=c89
dapat digunakan untuk mengabaikan//
komentar gaya baru . Bahkan dengan mereka,cpp
ganti komentar dengan spasi (alih-alih menghapusnya), dan runtuh spasi dan baris kosong.Saya pernah membuat ini yang bisa kita perbaiki:
untuk menangani beberapa kasus sudut lainnya.
Perhatikan bahwa jika Anda menghapus komentar, Anda dapat mengubah arti kode (
1-/* comment */-1
diuraikan seperti1 - -1
sementara1--1
(yang akan Anda dapatkan jika Anda menghapus komentar) akan memberi Anda kesalahan). Lebih baik mengganti komentar dengan karakter spasi (seperti yang kita lakukan di sini) daripada sepenuhnya menghapusnya.Contoh di atas harus berfungsi dengan baik pada kode ANSI C yang valid ini, misalnya yang mencoba memasukkan beberapa kasus sudut:
Yang memberikan hasil ini:
Keduanya mencetak output yang sama saat dikompilasi dan dijalankan.
Anda dapat membandingkan dengan output
gcc -ansi -E
untuk melihat apa yang akan dilakukan oleh pra-prosesor. Kode itu juga merupakan kode C99 atau C11 yang valid, namungcc
menonaktifkan dukungan trigraph secara default sehingga tidak akan berfungsigcc
kecuali jika Anda menentukan standar sukagcc -std=c99
ataugcc -std=c11
atau tambahkan-trigraphs
opsi).Ini juga berfungsi pada kode C99 / C11 (non-ANSI / C90) ini:
(bandingkan dengan
gcc -E
/gcc -std=c99 -E
/gcc -std=c11 -E
)ANSI C tidak mendukung
// form
komentar.//
tidak berlaku di ANSI C sehingga tidak akan muncul di sana. Satu kasus yang dibuat-buat di mana//
mungkin benar-benar muncul di ANSI C (seperti yang disebutkan di sana , dan Anda mungkin menemukan sisa diskusi yang menarik) adalah ketika operator pengikat sedang digunakan.Ini adalah kode C ANSI yang valid:
Dan pada saat diskusi tahun 2004,
gcc -ansi -E
memang memperluas ke"//not a comment"
. Namun hari ini,gcc-5.4
mengembalikan kesalahan pada itu, jadi saya ragu kita akan menemukan banyak kode C menggunakan konstruksi semacam ini.sed
Setara GNU dapat berupa:Jika GNU Anda
sed
terlalu tua untuk didukung-E
atau-z
, Anda dapat mengganti baris pertama dengan:sumber
gcc -std=c11 -E -P
(-ansi
hanya nama lain untuk-std=c90
).??'
), maka kami membandingkannya dengan konstruksi C90cpp -ansi
/ C11 ... satu (suka// xxx
), maka kami membandingkannya dengancpp
(ataucpp -std=c11
...)dengan
sed
:MEMPERBARUI
mendukung semua yang mungkin (komentar multi baris, data setelah [atau dan] sebelum,);
Lari:sumber
proc print data 2nd /*another comment is here*/
Hapus baris kosong jika ada:
Edit - versi lebih pendek dari Stephane:
sumber
-0777
sebagai cara yang lebih singkatBEGIN{$/=undef}
.*?
bukan.+?
jika/**/
adalah komentar yang valid juga.Solusi dengan menggunakan perintah SED dan tanpa Script
Anda disini:
sed 's/\*\//\n&/g' test | sed '/\/\*/,/\*\//d'
NB Ini tidak berfungsi pada OS X, kecuali jika Anda menginstal
gnu-sed
. Tetapi ini bekerja pada distro Linux.sumber
-i
opsi untuk mengedit file di tempat alih-alih mengarahkan output ke file baru. atau jauh lebih aman-i.bak
untuk membuat cadangan filesed
beroperasi pada satu baris pada satu waktu, tetapi beberapa komentar di input span beberapa baris. Sesuai /unix//a/152389/90751 , Anda dapat menggunakan pertama-tamatr
untuk mengubah pemisah baris menjadi beberapa karakter lain. Kemudiansed
dapat memproses input sebagai satu baris, dan Anda gunakantr
lagi untuk mengembalikan jeda baris.Saya telah menggunakan byte nol, tetapi Anda dapat memilih karakter apa pun yang tidak muncul di file input Anda.
*
memiliki arti khusus dalam ekspresi reguler, sehingga perlu melarikan diri\*
untuk mencocokkan dengan literal*
..*
adalah serakah - itu akan cocok dengan teks yang mungkin terpanjang, termasuk lebih*/
dan/*
. Itu berarti komentar pertama, komentar terakhir, dan semua yang ada di antaranya. Untuk membatasi ini, ganti.*
dengan pola yang lebih ketat: komentar dapat berisi apa pun yang bukan "*", dan juga "*" diikuti oleh apa pun yang bukan "/". Proses banyak*
juga harus diperhitungkan:Ini akan menghapus semua linebreak di komentar multiline, yaitu.
akan menjadi
Jika ini bukan yang diinginkan,
sed
dapat dikatakan untuk menjaga salah satu linebreaks. Ini berarti memilih karakter pengganti linebreak yang dapat dicocokkan.Karakter khusus
\f
, dan penggunaan referensi-belakang yang mungkin tidak cocok dengan apa pun, tidak dijamin berfungsi sebagaimana dimaksud dalam semuased
implementasi. (Saya mengkonfirmasi itu berfungsi pada GNU sed 4.07 dan 4.2.2.)sumber
test.sas
di tengah-tengah jalur pipa di sana, jadi bacalahsed
langsung, dan yang pertamatr
tidak berpengaruh. Anda harus menggunakancat test.sas | tr ...
menggunakan sed satu baris untuk menghapus komentar:
sumber