ฉันจะ "แมว" ไฟล์และลบบรรทัดที่มีความคิดเห็นได้อย่างไร


29

ฉันต้องการทราบว่ามีวิธีที่ฉันสามารถcatยื่นphp.iniและลบบรรทัดทั้งหมดที่ขึ้นต้นด้วย;

ตัวอย่างเช่นหากไฟล์มีสิ่งนี้:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

และฉันรันคำสั่งที่ถูกต้องcat | {remove comments command}จากนั้นฉันก็จะจบลงด้วย:

error_reporting  =  E_ALL & ~E_NOTICE

หมายเหตุ - ฉันสันนิษฐานว่าcatจะเป็นวิธีที่ดีที่สุดที่จะทำเช่นนี้ แต่จริง ๆ แล้วผมดีกับคำตอบโดยใช้ยูทิลิตี้อื่นเช่นawk, sed, egrepฯลฯ


แล้วมีอะไรประมาณerror_reporting = E_ALL & E_NOTICE ; Show all errors, except for noticesนี้ ควรลบความคิดเห็นในกรณีนี้ด้วยหรือไม่
CVn

@ MichaelKjörling - ฉันสบายดีมีเพียงบรรทัดที่เริ่มต้นด้วยการลบความคิดเห็น
cwd

1
catเป็นเครื่องมือในการเชื่อมไฟล์เข้าด้วยกัน grepเป็นเครื่องมือในการกรองบรรทัดตามรูปแบบ sedและawkยังสามารถแก้ไขบรรทัดเหล่านั้น
Stéphane Chazelas

คำตอบ:



25

คุณไม่จำเป็นต้องไพพ์ไฟล์ผ่าน grep, grep ใช้ชื่อไฟล์เป็นบรรทัดคำสั่ง args

grep -v '^#' file1 file2 file3

จะพิมพ์ทุกบรรทัดยกเว้นบรรทัดที่ขึ้นต้นด้วย # char คุณสามารถเปลี่ยนถ่านความคิดเห็นเป็นสิ่งที่คุณต้องการ

หากคุณมีมากกว่าหนึ่งความคิดเห็นถ่าน (สมมติว่ามันอยู่ที่จุดเริ่มต้นของบรรทัด)

egrep -v '^(;|#|//)' filelist

2
grep '^[^;]' filenameหนึ่งที่ผมได้กระทำที่ติดอยู่เสมอกับฉันอีกประการหนึ่งคือ ฉันพูดไม่ได้กับการพกพาของมัน!
โจดี้ซี

@JodieC มันเป็นแบบพกพา แต่ยังลบบรรทัดว่าง (ซึ่งมักจะต้องการ) เทียบเท่ามาตรฐานของการมีegrep grep -Eท่านสามารถใช้grep -ve '^[;#]' -e '^//'
Stéphane Chazelas

9

egrepcatคุณสามารถบันทึกการใช้งานของ กล่าวอีกนัยหนึ่งให้สร้างกระบวนการที่น้อยลง ( egrepvs cat+ egrep) และใช้บัฟเฟอร์ที่น้อยลง (ไปป์จากcatไปยังegrepvs ไม่ต้องไปป์)

โดยทั่วไปแล้วเป็นความคิดที่ดีที่จะ จำกัด การใช้งานcatหากคุณต้องการส่งไฟล์ไปยังคำสั่งที่สามารถอ่านได้ด้วยตัวเอง

ด้วยวิธีนี้กล่าวว่าคำสั่งต่อไปนี้จะลบความคิดเห็นแม้ว่าพวกเขาจะเยื้องกับช่องว่างหรือแท็บ:

egrep -v '^ [[: blank:]] *;' file.ini

ตลกที่คุณรวมรูปแบบ[[ คลาสอักขระ ]] regex ใหม่กับการใช้egrepคำสั่งที่คัดค้านอย่างน้อยหนึ่งทศวรรษหรือมากกว่านั้น
mikeserv

น่าสนใจ ... เอกสารปัจจุบันที่gnu.org/software/grep/manual/html_node/…รวมคลาส POSIX
Jack Wasey

7
egrep -v '^;|^$' $file

ที่จะยกเว้นบรรทัดที่ขึ้นต้นด้วย ';' และบรรทัดว่าง

ใน regex ^ระบุจุดเริ่มต้นของบรรทัดและ$จุดสิ้นสุดของบรรทัดดังนั้น^$ระบุบรรทัดที่จุดเริ่มต้นของอักขระบรรทัดและอักขระสิ้นสุดบรรทัดอยู่ติดกัน


ดังนั้นถ้าฉันอ่านถูกต้องสิ่งนี้สามารถลบบรรทัดที่มีความคิดเห็น แต่ยังว่างบรรทัดได้หรือไม่
cwd

1
@cwd ใช่ ฉันไม่แน่ใจว่าทำไมเขาถึงรวมไว้ทั้งคู่ แต่ถ้าคุณต้องการลบบรรทัดที่มีคอมegrep -v '^;'
เม้นต์ให้

4
egrep ก็ชอบไฟล์เช่นกัน (ใช้กระบวนการและบัฟเฟอร์น้อยลง) และโบนัสเล็กน้อยก็เพื่อลบความคิดเห็นที่เยื้องออกมาด้วย:egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
เราต้องการตรา "ใช้ประโยชน์แมว"
Simon Richter

@nrolans - ดูเหมือนความคิดเห็นยอดนิยมทำไมไม่ลองตอบดูล่ะ?
cwd

2

awkซับง่ายหนึ่งawk '/^;/{next}1' input_fileควรทำเคล็ดลับ

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 

3
ถูกต้อง แต่ verbose เพียงแค่awk '!/^;/' input_fileเป็นพอ
จัดการ

2

เช่นเดียวกับ Jaypal ฉันก็อาจจะใช้awkเพื่อวัตถุประสงค์เหล่านี้เช่นกัน มันแย่กว่าที่จะพูดถึงว่าบางครั้ง Perl มีประโยชน์มากสำหรับวัตถุประสงค์ดังกล่าว:

cat data.txt | perl -lne "print unless /^;/"

Perl regexps นั้นมีประสิทธิภาพมากกว่าเมื่อเทียบกับ awk's และบางครั้งคุณอาจต้องการมัน


+1 สำหรับ perl แม้ว่า cat และ the-l จะซ้ำซ้อนดังนั้นการร้องขอที่ง่ายกว่าคือperl -ne 'print unless /^;/' data.txt
Simon Whitaker

@ Simone Whitaker ใช่คุณพูดถูก - มันเป็นนิสัยที่จะเขียนมันอย่างที่ฉันเขียนและมันก็คุ้มค่าที่จะพูดถึงมัน
shabunc

1
แน่นอนค่ะ ในความเป็นจริงฉันคิดว่าใช้catงานได้ดีในตัวอย่างเหล่านี้หากคุณพิจารณาว่าเป็นพร็อกซีสำหรับ "สิ่งใดก็ตามที่สร้างข้อความบน STDOUT" ท่อยูนิกซ์เป็นสิ่งที่ดีที่สุดตั้งแต่ขนมปังหั่นขนมปังอิโมะ :)
Simon Whitaker

2

คำตอบอย่างละเอียดของ @ shabunc ซึ่งใช้ Perl เพื่อตัดความคิดเห็น (รวมถึงความคิดเห็นแบบอินไลน์) จากนั้นพิมพ์บรรทัดใด ๆ ที่มีสิ่งอื่นนอกเหนือจากช่องว่าง

$ perl -ne 's/;.*//; print if /\S/' data.txt

คำอธิบาย:

  • s/;.*//ใช้ตัวดำเนินการแทน ( s/<regex>/<replacement>/) เพื่อแทนที่อินสแตนซ์ของเซมิโคลอนและทุกสิ่งที่ตามมาบนบรรทัดด้วยสตริงว่าง
  • print if /\S/พิมพ์บรรทัดหากตรงกับ regexp \Sซึ่งเป็นคลาสอักขระที่ตรงกับอักขระที่ไม่ใช่ช่องว่างทั้งหมด

1

นี่คือสิ่งที่ฉันใช้เพียงแค่แทนที่ ';' ด้วยอักขระความคิดเห็น (เช่น '#' สำหรับไฟล์การกำหนดค่าบริการ UNIX จำนวนมาก):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

ที่ได้รับการกำจัดความคิดเห็นทั้งบรรทัด (แม้ว่าพวกเขาจะมีช่องว่างนำ) และความคิดเห็นใด ๆ ที่จบบรรทัดที่ไม่ใช่ความคิดเห็นและรวบรัดลบบรรทัดว่างจากเอาท์พุทเช่นกัน สิ่งนี้อาจเป็นไปได้หากไม่มีท่อ (สิ่งที่น่ากลัวหรือ awk-fu ของฉันไม่เป็นที่ยอมรับ) แต่มันง่ายสำหรับฉันที่จะเข้าใจ (และจำไว้) ฉันคิดว่าฉันจะโพสต์ไว้ที่นี่


1

ตัวอย่างแสดงเฉพาะบรรทัด + ไม่แสดงบรรทัดใหม่หรือบรรทัด emtpy:

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

หรือ

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server

2
การใช้egrepงานเลิกใช้นาน grep -Eเป็นคำสั่งที่คุณกำลังมองหาที่นี่
mikeserv

0
egrep -v ^'(#|$)' file.txt

ดึงความคิดเห็นและบรรทัดว่างทั้งหมดจาก file.txt


2
คุณควรพิจารณาขยายคำตอบของคุณด้วยข้อมูลเพิ่มเติมเล็กน้อยสำหรับผู้ที่ไม่ได้ฝึกหัด (เช่นสิ่งที่คุณใช้กับ regex)
HalosGhost

egrepถูกคิดค่าเสื่อมราคา ใช้grep -Evแทน
Yokai


0

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อบันทึกบรรทัดยกเว้นบรรทัดว่างและบรรทัดที่ขึ้นต้นด้วย # ในไฟล์ใหม่

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>


เปล่าดายcatท่อและegrepคิดค่าเสื่อมราคาและถูกแทนที่ด้วยสีหน้าขยายหรือเพียงแค่grep -E grep -v
Yokai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.