วิธีที่ง่ายที่สุดในการคอมเมนต์ / uncomment บางบรรทัดโดยใช้บรรทัดคำสั่ง


37

มีวิธีการแสดงความคิดเห็น / uncomment สคริปต์ shell / config / ruby ​​โดยใช้บรรทัดคำสั่งหรือไม่

ตัวอย่างเช่น:

$ comment 14-18 bla.conf
$ uncomment 14-18 bla.conf

นี้จะเพิ่มหรือลบ#ป้ายbla.confบนเส้นไป14 18ปกติฉันจะใช้sedแต่ฉันต้องรู้เนื้อหาของบรรทัดเหล่านั้นแล้วทำการค้นหาแทนที่และนั่นจะให้ผลลัพธ์ที่ผิดเมื่อมีเข็มมากกว่าหนึ่งเข็ม (และเราต้องการแทนที่ N-th เท่านั้น หนึ่ง).


1
: มี A ถึง Q นี้บรรดาศักดิ์เป็นuncommenting หลายบรรทัดของรหัสที่ระบุโดยหมายเลขบรรทัดโดยใช้ vi หรือเป็นกลุ่มที่แสดงให้เห็นถึงวิธีการมากมายสำหรับการทำเช่นนี้โดยใช้sed, perlและอื่น ๆ โดยเฉพาะโดย terdon!
slm

คำตอบ:


46

หากต้องการแสดงความคิดเห็นบรรทัดที่ 2 ถึง 4 ของ bla.conf:

sed -i '2,4 s/^/#/' bla.conf

เพื่อให้คำสั่งที่คุณต้องการเพียงแค่ใส่ข้างบนลงในเชลล์สคริปต์ชื่อ comment:

#!/bin/sh
sed -i "$1"' s/^/#/' "$2"

สคริปต์นี้ใช้เหมือนกับของคุณยกเว้นว่าบรรทัดแรกและบรรทัดสุดท้ายจะคั่นด้วยเครื่องหมายจุลภาคแทนที่จะเป็นเส้นประ ตัวอย่างเช่น:

comment 2,4 bla.conf

คำสั่ง uncomment สามารถสร้างแบบอะนาล็อกได้

คุณสมบัติขั้นสูง

sedการเลือกบรรทัดมีประสิทธิภาพมาก นอกเหนือจากการระบุบรรทัดแรกและบรรทัดสุดท้ายตามหมายเลขแล้วยังสามารถระบุได้โดย regex ดังนั้นหากคุณต้องการคำสั่งทุกบรรทัดจากบรรทัดที่มีอยู่fooให้barใช้:

comment '/foo/,/bar/' bla.conf

ระบบ BSD (OSX)

ด้วย BSD sed -iตัวเลือกต้องมีอาร์กิวเมนต์แม้ว่าจะเป็นเพียงสตริงว่าง ตัวอย่างเช่นแทนที่คำสั่งด้านบนด้วย:

sed -i '' '2,4 s/^/#/' bla.conf

และแทนที่คำสั่งในสคริปต์ด้วย:

sed -i '' "$1"' s/^/#/' "$2"

1
เป็นสองเท่า'หลังจาก-iตัวเลือกโดยเจตนา? ไม่ต้องการพวกเขา
raphinesse



2

คุณสามารถสร้าง bash_file ด้วยฟังก์ชั่นเพื่อนำมาใช้ใหม่ในโครงการของคุณ

#!/bin/bash

# your target file
CONFIG=./config.txt

# comment target
comment() {
  sed -i '' "s/^$1/#$1/" $CONFIG
}

# comment target
uncomment() {
  echo $1
  sed -i '' "s/^#$1/$1/" $CONFIG
}


# Use it so:
uncomment enable_uart
comment arm_freq
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.