Bash Sed ตัวอย่าง

Bash Sed Examples



Bash ให้คุณทำการแทนที่รูปแบบโดยใช้การขยายตัวแปร เช่น (${var/pattern/replacement}) ดังนั้น sed แบบนี้ (sed -e ‘s/pattern/replacement/’) อย่างไรก็ตาม มีสิ่งที่ต้องทำมากกว่าการเปลี่ยนรูปแบบในไฟล์ข้อความ ที่นี่เราจะค้นพบ sed อีกครั้งโดยใช้คำสั่งและเวิร์กโฟลว์ที่เทียบเท่ากันเพื่อช่วยในงานประจำวัน

ตั้งค่าตัวอย่าง sed

ต่อไปนี้คือคำแนะนำโดยย่อในการตั้งค่าตัวอย่าง ซึ่งผมจะพยายามไม่ให้เกินความสามารถเกินไป







คำเป็นไฟล์ข้อความที่มีตัวเลขตั้งแต่ 1 ถึง 100 หากคุณไม่แน่ใจเกี่ยวกับคำสั่งที่จะสร้าง โปรดดูที่ฟังก์ชันการส่งออกสำหรับ xargs ใน Bash Export Command คุณไม่มีทางรู้ว่ามันอาจจะอยู่ในการสัมภาษณ์เชลล์สคริปต์ครั้งต่อไปของคุณ



บาร์เป็นไฟล์ข้อความที่มีบรรทัดเดียว —.



เก่า-phpเป็นไฟล์ข้อความที่มีบรรทัดของ PHP เก่าที่จะแตกใน php7 หรือใหม่กว่า (คำแนะนำ: ereg)





โปรดทราบว่าฟังก์ชันทั้งหมดที่อธิบายไว้ข้างต้นมีอยู่ใน Endnote เกี่ยวกับฟังก์ชันสำหรับการตั้งค่า

ตัวอย่างที่มีคำสั่งเทียบเท่า

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



1. พิมพ์เส้นสุ่ม (เทียบเท่า sort -R – | head -1)

sed -NS '$(( สุ่ม % 100 ))NS'-

2.พิมพ์บรรทัดสุดท้ายในไฟล์ (เทียบเท่ากับ head -1 -)

sed -NS '$p'-

3. พิมพ์ 10 บรรทัดแรกในไฟล์ (เทียบเท่า head -n 10 -)

sed '10q'-

4. พิมพ์บรรทัดแรกในไฟล์ (เทียบเท่า tail -1 -)

sed -NS '1p'-

5. ลบอินสแตนซ์ทั้งหมดของอักขระ (เทียบเท่ากับ tr –delete '0' - โดยที่ 0 คืออักขระที่เราต้องการลบ)

sed -และ 's / 0 // ก'-

6. แปลงไฟล์ csv เป็น tsv (เทียบเท่ากับ tr ',' ' ' -)

sed -และ 's/,/ /g'-

7. ต่อท้ายไฟล์ (เทียบเท่ากับ cat bar -)

sed '$ ก---'-

8. ต่อท้ายไฟล์ (เทียบเท่า cat – bar)

sed '1i---'-

9. พิมพ์ทุกบรรทัดในไฟล์ (เทียบเท่า cat -)

sed -NS -และ 'NS'-

10. พิมพ์บรรทัดที่ตรงกับรูปแบบ (เทียบเท่า grep -e '^1' -)

sed -NS -และ '/^1/ พี'-

11. ลบเส้นที่ตรงกับรูปแบบ (เทียบเท่า grep -v -e '^1' -)

sed -และ '/^1/ วัน'-

12. รับจำนวนบรรทัดในไฟล์ (เทียบเท่า wc -l -)

sed -NS -และ '$ ='-

13. เขียนไฟล์ในพื้นหลัง (คำสั่งเทียบเท่า tee)

sed 'ใน$ {1}'-

ตัวอย่างการใช้ sed เพื่อนำคำสั่ง tee ไปใช้

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

คำสั่ง

ที ()
{
ทดสอบ $ {#} -eq 1 || กลับ;
sed 'ใน$ {1}'-
}
หลัก()
ทีนี้;
แมวนี้

หลัก

เอาท์พุต

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

ที่นี่คุณจะเห็นสองรายการของจำนวนเต็มตั้งแต่ 1 ถึง 10 รายการแรกมาจากคำสั่ง seq วินาทีที่เราได้รับจาก cat ของไฟล์ที่เขียนด้วย tee ฉันรู้ว่ามันไร้สาระ แต่ได้ผล!

ตัวอย่างการใช้ sed เพื่อพิมพ์บรรทัดสุ่มในไฟล์

สมมติว่าเราต้องการพิมพ์บรรทัดสุ่มในไฟล์โดยใช้ bash และ sed เล็กน้อย เราสามารถทำได้หรือไม่? ใช่เราทำได้! นี่คือวิธีการ

ดำเนินการฟังก์ชั่นที่

  1. รับจำนวนบรรทัดในไฟล์ L
  2. สร้างตัวเลขสุ่มระหว่าง 1 ถึง L, R
  3. พิมพ์ R

ฟังก์ชันนี้คาดว่าอินพุตจะถูกวางจากภายนอก

คำสั่ง

บางบรรทัด()
{
การทำงานlc()
{
sed -NS -และ '$ ='-
};
การทำงานพิมพ์ไลน์()
{
sed -NS -และ '$ {1}NS'-
};
อุณหภูมิ= $( mktemp );
แมว-> ${ชั่วคราว};
แมว ${ชั่วคราว} |พิมพ์บรรทัด $((สุ่ม%$( แมว ${ชั่วคราว} |lc)+1 ));
rm ${ชั่วคราว}
}

ตัวอย่างการใช้งาน (1)

seq 100 |_

เอาท์พุต (1)

35

ตัวอย่างการใช้งาน (2)

ขด https://linuxhint.com/bash_cut_command/ --เงียบ |แถบป้าย|บางบรรทัด

ดูตัวอย่างด้านล่างโดยใช้ sed เพื่อตัดแท็ก HTML โปรดทราบว่าบางครั้งตัวอย่างที่ทับจะคืนค่าว่างสำหรับบรรทัดว่าง เป็นการออกกำลังกายก็สามารถปรับปรุงได้

การใช้ sed เพื่อพิมพ์บรรทัดในไฟล์

สมมติว่าคุณต้องการใช้ฟังก์ชันใน bash เพื่อพิมพ์บรรทัดที่กำหนดในไฟล์ การพยายามพิมพ์บรรทัดเดียวในไฟล์โดยใช้การวนซ้ำใน bash, head, tail หรือ awk นั้นทำงานมากเกินไปสำหรับการพิมพ์บรรทัดในไฟล์ สิ่งที่ดีที่เราได้ sed ฟังก์ชันผลลัพธ์ที่ใช้ sed จะเป็นดังนี้

คำสั่ง

พิมพ์ไลน์()
{
sed -NS '$ {1}NS'-
}

ตอนนี้เรามาดูกันว่าจะเกิดอะไรขึ้นเมื่อเราใช้บรรทัดพิมพ์บนคำ

คำสั่ง

คำ|พิมพ์ไลน์ห้าสิบ

เอาท์พุต

ห้าสิบ

ตกลง. ดูดี แต่ขอลองสิ่งที่ดูเล็กน้อยน้อยลง

คำสั่ง

ประกาศ -xfคำ
ประกาศ -xfพิมพ์ไลน์
seq 1 10$(คำ| ห้องน้ำ -NS ) | xargs-ผมทุบตี -ค 'คำพูด | พิมพ์บรรทัด {}'

เอาท์พุต

1
สิบเอ็ด
ยี่สิบเอ็ด
31
41
51
61
71
81
91

ตกลง. ตอนนี้เป็นแบบนั้นมากขึ้น! คุณเห็นว่า sed อาจถูกใช้ใน bash script เพื่อพิมพ์บรรทัดใด ๆ ในไฟล์ได้อย่างไร

ตัวอย่างที่ไม่มีคำสั่งเทียบเท่า

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

คำสั่งทุกบรรทัดในเชลล์สคริปต์

sed -และ 's/^/#/'-
ลบบรรทัดแรก
sed -และ '1 วัน'-
ลบล่าสุดไลน์
sed -และ '$ d'-
แทรกบรรทัดก่อนบรรทัดที่ตรงกับรูปแบบ
sed '/0$/ผม ---'-
แทรกบรรทัดหลังบรรทัดที่ตรงกับรูปแบบ
sed '/ 0 $ / ---'-
ดึงแท็ก html ออก
sed -และ ของ /†*.// g'-
อัพเกรด eregในรหัส php เก่าที่จะเรียกใช้ในphp7 หรือใหม่กว่า
sed 's/ereg(([^,]*).([^)]*)./strpos(2,1)/g'
ตรวจสอบถ้า sedมาก่อนบางรุ่น
sed -และ 'v 4.5'-

ตัวอย่างการแยกรุ่น sed ใน bash

ในตัวอย่างด้านบน มีบรรทัดให้ตรวจสอบว่า sed นั้นเก่ากว่าเวอร์ชันบางเวอร์ชันที่เราสามารถใช้เพื่อปรับใช้การแยกเวอร์ชันใน bash หรือไม่ ซึ่งฉันเชื่อว่าง่ายกว่าการพยายามใช้ฟังก์ชันเพื่อเปรียบเทียบหมายเลขเวอร์ชันจากเอาต์พุต sed –version . ข้อผิดพลาดเพียงอย่างเดียวคือหากมี sed เวอร์ชันก่อนหน้าที่ไม่สนับสนุนคำสั่ง v แสดงว่าเรากำลังประสบปัญหา

คำสั่ง

test-sed-version-at-most() {
โยนออก -NS | sed 'v$ {1}'-2> /dev/โมฆะ
}
ลองรุ่น()
{
โยนออก -NS 'เวอร์ชั่น$ {1}. ตกลง. ทำมัน ';
test-sed-version-at-most$ {1} && {
โยนออก -NS 'เก่า';
จริง
} || {
โยนออก -NS 'ใหม่'
};
โยนออก ' ทาง.'
}
หลัก()
{
ท้องถิ่นวี;
สำหรับวีใน 4.{4,5};
ทำ
ลองรุ่น$ {v};
เสร็จแล้ว
}
หลัก

เอาท์พุต

เวอร์ชั่น4.4. ตกลง. ทำแบบเก่า.
เวอร์ชั่น4.5. ตกลง. ทำมันด้วยวิธีใหม่

โปรดทราบว่าเวอร์ชันของ sed ที่ทำงานบนเครื่องของฉันในขณะที่พิมพ์อักขระเหล่านี้คือ 4.4 ซึ่งจะอธิบายผลลัพธ์ด้านบน ในขณะเดียวกัน gnu sed เวอร์ชันล่าสุดคือ 4.7 ซึ่งเก่ากว่าเวอร์ชันที่ฉันมีประมาณ 3 ปี ของฉันแก่แล้ว! อันที่จริงแล้ว ใน sed 4.0.6 มีการเพิ่มพารามิเตอร์ลงในคำสั่ง version ดังนั้นกลยุทธ์นี้จึงใช้ได้กับ v4.0.6 ที่กล่าวไว้เป็นอย่างน้อย ซึ่งถือว่าผ่อนปรนเมื่อพิจารณาว่าเวอร์ชันนั้นเปิดตัวในต้นปี 2546 คุณทำได้ดี

ฉันทำการขุดพิเศษจริง ๆ แล้ว NEWS กำลังอ่านซอร์สโค้ดล่าสุด เวอร์ชัน 4.6 มีคุณลักษณะใหม่ –debug ซึ่งทิ้งสคริปต์และใส่คำอธิบายประกอบบรรทัดเอาต์พุต สิ่งนี้จะช่วยให้คุณสามารถแปลสคริปต์ sed ที่สร้างโดยฟังก์ชันในรูปแบบ bash เป็นรูปแบบบัญญัติได้ เย็น! อย่าลืมว่าคุณต้องมีการแยกเวอร์ชัน sed ใน bash นั่นคือที่มาของตัวอย่างนี้

ตัวอย่างฟังก์ชันทุบตีที่ใช้ sed เพื่อตัดแท็ก HTML

ในตัวอย่างข้างต้น มีบรรทัดสำหรับตัดแท็ก HTML ออก ลองใส่มันลงในฟังก์ชันทุบตีและใช้เพื่อดึงแท็ก HTML ทั้งหมดออกจากบทความล่าสุดที่ฉันเขียน

คำสั่ง

แถบป้าย()
{
sed -และ ของ /†*.// g'-
}
ขด https://linuxhint.com/bash_cut_command/ --เงียบ |แถบป้าย

ฉันไม่สามารถพูดได้ว่ามันสมบูรณ์แบบ แต่อย่างน้อยก็สามารถอ่านได้ในเทอร์มินัล

ตัวอย่างเวิร์กโฟลว์: ตัวอย่างเวิร์กโฟลว์: แทนที่ทั้งหมดอย่างปลอดภัยโดยใช้ find, grep และ sed

พูดได้อย่างปลอดภัยว่าการเปลี่ยนแปลงที่ทำโดยใช้ sed ด้วยตัวเลือก -i นั้นไม่สามารถย้อนกลับได้ เว้นแต่คุณจะแน่ใจอย่างถ่องแท้ว่าข้อความใดจะถูกแทนที่ คุณมีแนวโน้มที่จะจบลงด้วยอักขระน้อยกว่าที่ตั้งใจไว้หนึ่งตัว นั่นคือเหตุผลที่ในตัวอย่างนี้ เราจะใช้ sed ในเวิร์กโฟลว์เพื่อแทนที่ข้อความในไฟล์ทั้งหมดที่คุณเลือกอย่างปลอดภัย

เวิร์กโฟลว์

  1. หา
  2. กริป
  3. sed
หา

ที่นี่คุณจะเลือกไฟล์ที่จะเปลี่ยน ฉันแนะนำให้ใช้คำสั่งตามบรรทัดเหล่านี้:

หา -พิมพ์NS-ชื่อ | กริป -v-และ| xargs-ผม ...

ตัวอย่างเช่น คุณอาจต้องการจำกัดไฟล์เพื่อแทนที่ไฟล์ PHP ยกเว้นไดเร็กทอรีที่เก็บ git ดังนี้

หา -พิมพ์NS-ชื่อ*.php| กริป -v -และ '.ไป' | xargs -ผม...

อ่านเพิ่มเติมเกี่ยวกับคำสั่ง xargs ใน bash

กริป

ต่อไปเราจะพยายามจับคู่ some_pattern ในไฟล์ที่เลือกไว้ดังนี้ โปรดทราบว่าเนื่องจากเราใช้ตัวเลือก -o สำหรับ grep เอาต์พุตจะแสดงเฉพาะสตริงที่ตรงกันถ้ามี

หา -พิมพ์NS-ชื่อ*.php| กริป -v -และ '.ไป' |
xargs -ผม กริป -และsome_pattern-หรือ

คำสั่งด้านบนควรส่งคืนรายการสตริงที่ตรงกับ some_pattern

sed

สุดท้าย เราต้องการแทนที่สตริงทั้งหมดที่ตรงกับ some_pattern ในการทำเช่นนั้นเราต้องแปลง grep เป็น sed ดังนี้

หา -พิมพ์NS-ชื่อ*.php| กริป -v -และ '.ไป' |
xargs -ผม sed -ผม -และNS/some_pattern/ทดแทน/NS

คำสั่ง grep จะกลายเป็น sed -i และอ็อพชัน -o จะถูกลบออก และที่นั่นคุณมีมัน

ตอนนี้คุณสามารถตรวจสอบว่าสตริงใดจะถูกแทนที่ด้วย sed ล่วงหน้า แทนที่จะทดสอบโชคของคุณ

Endnotes เกี่ยวกับตัวเลือกที่ใช้ในตัวอย่าง

ต่อไปนี้คือรายการตัวเลือกที่ใช้ในตัวอย่างที่กล่าวถึงโดยสังเขป

ตัวเลือก คำอธิบาย
-ผม แก้ไขในสถานที่ หากอินพุตเป็นไฟล์ (ไม่ได้ไพพ์) ผลลัพธ์ของนิพจน์จะเขียนทับเนื้อหาของไฟล์

เซดรับหนึ่ง

เช่น) sed -n …

-และ -e หมายถึงการแสดงออก พารามิเตอร์ของมันคือนิพจน์ในภาษา sed

เซดรับหลายอย่าง

เช่น) sed -e'expr1' -e'expr2'

-NS ซ่อนบรรทัดที่ไม่ได้รับผลกระทบจากนิพจน์ นั่นคือถ้านิพจน์เป็นคำสั่งพิมพ์ในภาษา sed บรรทัดที่ไม่รวมอยู่ในคำสั่งการพิมพ์จะไม่รวมอยู่ในผลลัพธ์

เช่น) sed -n …

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือก sed โปรดดูที่ sed –help

ตอนจบของคำสั่งเทียบเท่าที่ใช้ในตัวอย่าง

ยูทิลิตีบรรทัดคำสั่งต่อไปนี้รวมอยู่ในตัวอย่าง sed ที่มีคำสั่งเทียบเท่า

  • เรียงลำดับ
  • ศีรษะ
  • หาง
  • กริป
  • แมว
  • NS
  • ที

Endnote ในการต่อท้าย – ในตัวอย่างคำสั่งเทียบเท่า

ในกรณีที่คุณสงสัยว่าเกิดอะไรขึ้นกับอักขระ – ในตัวอย่าง บันทึกย่อนี้เหมาะสำหรับคุณ ฉันเพิ่มอักขระ – หลังคำสั่งส่วนใหญ่ในตัวอย่างเพื่อบอกใบ้ว่าเราคาดหวังว่าอินพุตจะได้รับผ่านไพพ์ นั่นคือ,

แมวบางไฟล์| เรียงลำดับ -NS-| ศีรษะ -1

อย่างไรก็ตาม เมื่อคำสั่งทางด้านซ้ายมีไพพ์ เราสามารถละเว้นคำใบ้ได้ดังนี้

แมวบางไฟล์| เรียงลำดับ -NS | ศีรษะ -1

นั่นคือสิ่งที่เกิดขึ้นกับอักขระ – หลังคำสั่งในตัวอย่าง

Endnotes เกี่ยวกับฟังก์ชั่นสำหรับการตั้งค่า

ในกรณีที่คุณกำลังมองหา นี่คือฟังก์ชันการตั้งค่าสำหรับตัวอย่างข้างต้น ผลลัพธ์ที่ได้รับโดยใช้ประกาศ -f อ่านเพิ่มเติมเกี่ยวกับคำสั่งประกาศใน bash สำหรับการใช้งานเพิ่มเติม

คำสั่ง

คำ()
{
seq 100
}
บาร์()
{
โยนออก ---
}
เก่า-php()
{
โยนออก 'ereg ($ UA,' Bottybot ')'
}

บรรทัดล่าง

ฉันสนุกกับการเขียน Bash sed ตัวอย่างและหยิบลูกเล่นพิเศษสองสามอย่างไปพร้อมกัน Sed เป็นยูทิลิตี้บรรทัดคำสั่งที่ทรงพลังและภาษาที่สื่อความหมายสำหรับจัดการไฟล์ข้อความ หากคุณชอบการเรียนรู้เกี่ยวกับเซ็ด อย่ากังวลว่ายังมีอะไรอีกมากที่รอให้คุณสัมผัส เซดออน