เป็นกลุ่มที่แสดงให้เห็นในทุก ๆ ตอนจบ ^ M
ฉันจะทำอย่างไรเพื่อแทนที่ด้วย linebreak 'ปกติ'?
เป็นกลุ่มที่แสดงให้เห็นในทุก ๆ ตอนจบ ^ M
ฉันจะทำอย่างไรเพื่อแทนที่ด้วย linebreak 'ปกติ'?
คำตอบ:
:e ++ff=dos
ตามด้วย:set ff=unix
จะแปลงตอนจบเป็นรูปแบบมีเหตุผล
:%s/<Ctrl-V><Ctrl-M>/\r/g
ในกรณีที่<Ctrl-V><Ctrl-M>
หมายถึงประเภทCtrl+ Vแล้ว+
CtrlM
:%s
ทดแทน,% = ทุกบรรทัด
<Ctrl-V><Ctrl-M>
อักขระ ^ M (Ctrl-V เป็นวิธี Vim ในการเขียนอักขระ Ctrl ^ และ Ctrl-M เขียน M หลังจากนิพจน์ปกติส่งผลให้มีอักขระพิเศษ ^ M)
/\r/
กับบรรทัดใหม่ ( \r
)
g
และทำทั่วโลก (ไม่ใช่แค่เกิดขึ้นครั้งแรกในบรรทัด)
:%s/<Ctrl-V><Ctrl-M>/\r/g
(โดยที่ \ r แทนที่ ^ M ด้วยบรรทัดใหม่)
บน Linux และ Mac OS งานต่อไปนี้
:%s/^V^M/^V^M/g
ที่^V^M
ประเภทวิธีCtrl+ Vแล้ว+CtrlM
หมายเหตุ: บน Windows คุณอาจต้องการใช้^Q
แทน^V
เนื่องจาก^V
จะถูกแมปเพื่อวางข้อความ
%s/\r/\r/g
ทำงานได้ดีบน MacVim สำหรับไฟล์ที่แสดงเฉพาะ^M
ที่ส่วนท้ายของบรรทัด (หนึ่งบรรทัดที่ยาวในเงื่อนไข MacVim) ชัดเจน \ r หมายถึงสิ่งต่าง ๆ ในรูปแบบเทียบกับชิ้นส่วนทดแทนของคำสั่งนี้
ภายในvim
ดูรูปแบบไฟล์ - DOS หรือ Unix:
:set filetype=unix
:set fileformat=unix
ไฟล์จะถูกเขียนกลับโดยไม่มีอักขระ carriage return (CR, ^ M)
set ff=unix
ft
filetype
ไฟล์ที่ฉันสร้างขึ้นด้วย BBEdit ที่เห็นในMacVimแสดง^M
ผลตอบแทนเป็นจำนวนมากแทนที่จะเป็นไฟล์ธรรมดา การแทนที่สตริงต่อไปนี้สามารถแก้ไขปัญหาได้ - หวังว่านี่จะช่วยได้:
:%s/\r/\r/g
เป็นเรื่องที่น่าสนใจเพราะฉันกำลังแทนที่ตัวแบ่งบรรทัดด้วยอักขระตัวเดียวกัน แต่ฉันคิดว่า Vim แค่ต้องการให้แสดงใหม่อย่างถูกต้อง ฉันสนใจที่จะทราบกลไกพื้นฐานของการทำงานนี้
\r
ตัวละครทั้งหมดด้วย\n
แม้จะระบุ\r
ว่าเป็นการแทนที่ ไม่บ่นนั่นคือสิ่งที่ฉันต้องการ แค่แปลก ๆ
ขั้นแรกให้ใช้:set ff?
เพื่อหารูปแบบไฟล์ที่ไฟล์ของคุณเป็น
ฉันเดาว่าอาจเป็นไปได้unix
ปัญหาก็คือไฟล์ของคุณถูกสร้างขึ้นด้วยfileformat=dos
การเพิ่ม "^ M ^ J" ลงในส่วนท้ายบรรทัด แต่อ่านด้วยflieformat=unix
การลบเฉพาะ "^ J" ออกจากปลายบรรทัดโดยปล่อย "^ M" ไว้ที่นั่น
เพียงป้อนข้อมูล:e ++ff=dos
ในบรรทัดคำสั่ง Vim เพื่อเปลี่ยนรูปแบบไฟล์ของคุณจาก unix เป็น dos มันควรจะแก้ปัญหา ถ้าไม่:%s/\r//g
ควรช่วยคุณออก
:e ++ff=dos
จากนั้น:set ff=unix
และ:w
เพื่อให้ได้ตัวอักษร ^ M เพื่อให้ตรงกับที่ฉันต้องมองเห็นมันเลือกแล้วใช้คัดลอก OS คำสั่งไปยังคลิปบอร์ดเพื่อดึงมัน คุณสามารถทดสอบได้โดยค้นหาอักขระก่อนลองคำสั่ง replace
/^M
ควรเลือกบรรทัดแรกที่ไม่ดี
:%s/^M/\r/g
จะแทนที่ errant ทั้งหมด ^ M ด้วย carriage return
นี่เป็นฟังก์ชั่นใน MacVim ซึ่งใช้ gvim 7
แก้ไข:
มีปัญหานี้อีกครั้งในเครื่อง Windows 10 ของฉันซึ่งมี Ubuntu สำหรับ Windows และฉันคิดว่านี่เป็นสาเหตุของปัญหาไฟล์ในรูปแบบสำหรับกลุ่ม ในกรณีนี้การเปลี่ยน ff เป็น unix, mac หรือ dos ไม่ได้ทำอะไรนอกจากการเปลี่ยน ^ M เป็น ^ J และกลับมาอีกครั้ง
การแก้ปัญหาในกรณีนี้:
:%s/\r$/ /g
:%s/ $//g
เหตุผลที่ฉันไปเส้นทางนี้คือเพราะฉันต้องการให้แน่ใจว่าฉันไม่ทำลายไฟล์ของฉัน ฉันสามารถมีได้:%s/\r$//g
แต่นั่นจะลบการคืนค่าขนส่งทันทีและอาจมีผลลัพธ์ที่ไม่คาดคิด แต่เราแปลงอักขระ CR เอกพจน์นี่เป็นอักขระ ^ M เป็นช่องว่างแล้วลบช่องว่างทั้งหมดที่ท้ายบรรทัด (ซึ่งสำหรับฉันคือผลลัพธ์ที่พึงประสงค์โดยไม่คำนึงถึง)
ขออภัยในการฟื้นคำถามเก่าที่ตอบกลับมานาน แต่ดูเหมือนว่าจะมีความสับสนเกิดขึ้นและฉันคิดว่าฉันจะช่วยแก้ปัญหานี้เนื่องจากการค้นหาของ Google กำลังสูงขึ้น
สิ่งเหล่านี้ไม่ได้ผลสำหรับฉันดังนั้นฉันจึงลองทำสิ่งนี้ซึ่งใช้ได้:
ชนิด :%s/
กด CTRL-VCTRL-M
ชนิด //g
กด Enter
ดังนั้นคำสั่งโดยรวมใน Vim shoud จึงดูเหมือน :%s/^M//g
สิ่งนี้จะทำอะไร: :%s
(ค้นหาและแทนที่) /^M/
(สัญลักษณ์นั้น) /
(ไม่มีตัวอักษร) g
(ทั่วโลก)
^ M ถูกเรียกคืนโดยCtrl+ VและMทำเช่นนั้น
s/^M//g
โดยไม่จำเป็นต้องใช้ Ctrl:
:%s/\r$//
สิ่งที่ง่ายสำหรับฉัน
dos2unix filename
ฉันทำสิ่งนี้ด้วยใจ:
sed -i -e 's/\r/\n/g' filename
sed -e 's/\r/\n/g' <<< 'over and over'
->oven and oven
sed
แต่ไม่ใช่ BSD sed
(ตามที่พบใน OSX) ใครก็ตามที่แก้ไข linebreaks อาจทำงานร่วมกับระบบปฏิบัติการหลายแบบดังนั้นจึงมีประโยชน์ที่จะต้องเข้าใจอย่างชัดเจนว่าคำตอบจะทำงานเมื่อใด
เกี่ยวกับแค่:
:%s/\r//g
ที่ทำงานโดยสิ้นเชิงสำหรับฉัน
สิ่งนี้ทำเพื่อทำความสะอาดจุดสิ้นสุดของทุกบรรทัดมันลบ ^ M และนั่นคือมัน
มีคำตอบอื่น ๆ อีกมากมายสำหรับคำถามนี้ แต่ถึงกระนั้นต่อไปนี้ทำงานได้ดีที่สุดสำหรับฉันตามที่ฉันต้องการโซลูชันบรรทัดคำสั่ง:
vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile
คำอธิบาย:
myfile
:e ++ff=dos
เพื่อบังคับให้โหลดไฟล์ทั้งหมดเป็นจุดสิ้นสุดของดอส:w ++ff=unix
เพื่อเขียนไฟล์โดยใช้จุดสิ้นสุดบรรทัดยูนิกซ์Ctrl+ Mย่อเล็กสุดหน้าต่างของฉัน แต่Ctrl+ Enterแทรก^M
อักขระจริง ฉันต้องแน่ใจว่าจะไม่ถอดCtrlกุญแจระหว่างที่กด
ดังนั้นทางออกสำหรับฉันคือ:
:%s/<Ctrl-V><Ctrl-Enter>/\r/g
ในกรณีที่<Ctrl-V><Ctrl-Enter>
หมายถึงการกดค้างไว้ Ctrlกดปล่อยVกดปล่อยEnter, และจากนั้นปล่อยให้เป็นอิสระ Ctrl
การแก้ปัญหาดังกล่าวข้างต้นจะเพิ่มสายเพิ่มเติมระหว่างบรรทัดที่มีอยู่เพราะมีอยู่แล้วที่มองไม่เห็นหลัง\r
^M
เพื่อป้องกันสิ่งนี้คุณต้องการลบ^M
อักขระโดยไม่ต้องแทนที่
:%s/<Ctrl-V><Ctrl-Enter>//g
โดยที่%
"ในบัฟเฟอร์นี้" s
หมายถึง "แทนที่" /
หมายถึง "(ค้นหา) รูปแบบต่อไปนี้" <Ctrl-V><Ctrl-Enter>
หมายถึงปุ่มที่จะกดเพื่อให้ได้^M
ตัวอักษร (ดูด้านบน) //
หมายถึง "ไม่มีอะไร" (หรือ "ด้วยรูปแบบ ระหว่างเครื่องหมายสแลชทั้งสองนี้ซึ่งว่างเปล่า ") และg
เป็นความหมายแบบธง " ทั่วโลก "ซึ่งตรงข้ามกับเหตุการณ์แรกในบรรทัด
สิ่งนี้ใช้ได้กับฉัน:
\n
สิ้นสุดบรรทัด)ดังนั้นในกลุ่ม:
:set ff=unix
:w
ในกรณีของฉัน
ไม่มีอะไรข้างต้นทำงานฉันมีไฟล์ CSV คัดลอกไปยังเครื่อง Linux จาก mac ของฉันและฉันใช้คำสั่งทั้งหมดข้างต้น แต่ไม่มีอะไรช่วย แต่ด้านล่าง
tr "\015" "\n" < inputfile > outputfile
ฉันมีไฟล์ที่ตัวละคร ^ M ถูกขัดจังหวะระหว่างบรรทัดบางอย่างเช่นด้านล่าง
Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
อีกวิธีหนึ่งคือมียูทิลิตีโอเพนซอร์ซที่เรียกว่า dos2unix และ unix2dos ที่ทำสิ่งนี้ได้ บนระบบ linux อาจถูกติดตั้งตามค่าเริ่มต้น สำหรับระบบ windows คุณสามารถดาวน์โหลดได้จากhttp://www.bastet.com/และอื่น ๆ
sed s/^M//g file1.txt > file2.txt
โดยที่ ^ M พิมพ์โดยกดปุ่ม 3 พร้อมกัน ctrl + v + m
ใช้หนึ่งในคำสั่งเหล่านี้:
:%s/\r//g
หรือ
:%s/\r\(\n\)/\1/g
สิ่งนี้ใช้ได้กับฉัน:
:% s/\r\n/\r
หากต้องการบันทึกการกดแป้นพิมพ์คุณสามารถหลีกเลี่ยงการพิมพ์Ctrl+ VCtrl+ Mโดยวางสิ่งนี้ลงในแผนที่ เพียงแค่เปิดไฟล์ที่มีอักขระ ^ M ดึงมันแล้ววางลงในบรรทัดเช่นนี้ใน. vimrc ของคุณ:
nnoremap <Leader>d :%s/^M//g<CR>
ข้อเสนอแนะเหล่านี้ไม่ได้ผลสำหรับฉันที่มีการจัดการเพื่อรับการขึ้น^M
บรรทัดใหม่ขณะทำงานกับทั้งเสียงเรียกเข้าและ eclipse ฉันสงสัยว่าฉันพบกรณีนอก แต่ในกรณีที่มันช่วยใครก็ได้
:%s/.$//g
และมันก็แยกแยะปัญหาของฉัน
:g/^M/s// /g
หากคุณพิมพ์^M
โดยใช้Shift+6 Caps+M
จะไม่ยอมรับ
ctrl+v ctrl+m
คุณจำเป็นต้องพิมพ์
^M
ให้แบ่งบรรทัดที่ไม่พึงประสงค์ เพื่อจัดการสิ่งนี้เราสามารถใช้sed
คำสั่งดังต่อไปนี้:
sed 's/\r//g'
เพียงลบset binary
. vimrc ของคุณ!
หากต้องการใช้sed
บน MacOS ให้ทำสิ่งนี้:
sed -i.bak $'s/\r//' <filename>
คำอธิบาย:$'STRING'
ไวยากรณ์ที่นี่เกี่ยวข้องกับเปลือกทุบตี Macs ไม่ถือว่า\r
เป็นอักขระพิเศษ โดยการอ้างถึงสตริงคำสั่งซึ่ง$''
คุณกำลังบอกให้เชลล์แทนที่\r
ด้วย\r
อักขระจริงที่ระบุในมาตรฐาน ANSI-C
ฟังก์ชั่นนี้เก็บรักษารายการการข้าม
fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
set ff=unix
w!
"%s/\%x0d$//e
catch /E32:/
echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()
ฉันใช้เวลายามบ่ายไปกับ \ n ctrl-v 012 (ซึ่งทั้งคู่ส่ง null ให้ฉัน) & ทำงานในหัวข้อนี้จนกว่าฉันจะไปถึง metagrapher
\r
ทำงานได้ดีสำหรับฉัน!
/),/s/),/)\r/g
หันบางสิ่งเช่นนี้:
blacklist-extra: i386 (0.4.1, 0.4.1 + nmu1), libmount1: i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1: i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6.00-0.1, 6.00-0.2), libsane-common: i386 (1.0.22-7.3,
เป็นอะไรเช่นนี้:
26 libwv-1.2-4: i386 (1.2.9-3 อัตโนมัติ)
27 openjdk-6-jre-headre: i386 (6b24-1.11.4-3 อัตโนมัติ
28 jed: i386 (0.99.19-2.1)
มายากล. ฉันซาบซึ้งอย่างยิ่ง