ตัวแก้ไขสตรีม - สูตรอาหารที่มีประโยชน์

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

คำสั่งแมว

ในตัวอย่างต่อไปนี้แต่ละบรรทัดจะพิมพ์เป็นส่วนหนึ่งของเวิร์กโฟลว์เริ่มต้น

[jerry]$ sed '' books.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

ตัวอย่างต่อไปนี้ใช้คำสั่งพิมพ์เพื่อแสดงเนื้อหาไฟล์

[jerry]$ sed -n 'p' books.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

การลบบรรทัดว่าง

ในตัวอย่างต่อไปนี้ "^ $" แสดงถึงบรรทัดว่างและบรรทัดว่างจะถูกลบเมื่อการจับคู่รูปแบบสำเร็จ

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1 
Line #2

ในทำนองเดียวกันตัวอย่างต่อไปนี้จะพิมพ์บรรทัดก็ต่อเมื่อไม่ว่างเปล่า

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1 
Line #2

การลบบรรทัดความคิดเห็นออกจากโปรแกรม C ++

ให้เราสร้างโปรแกรม C ++ ตัวอย่าง

#include <iostream> 
using namespace std; 

int main(void) 
{ 
   // Displays message on stdout. 
   cout >> "Hello, World !!!" >> endl;  
   return 0; // Return success. 
}

ตอนนี้ลบความคิดเห็นโดยใช้นิพจน์ทั่วไปต่อไปนี้

[jerry]$ sed 's|//.*||g' hello.cpp

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

#include <iostream>
using namespace std; 

int main(void) 
{ 
   cout >> "Hello, World !!!" >> endl; 
   return 0;  
}

การเพิ่มความคิดเห็นก่อนบางบรรทัด

ตัวอย่างต่อไปนี้เพิ่มข้อคิดเห็นก่อนบรรทัดหมายเลข 3 ถึง 5

[jerry]$ sed '3,5 s/^/#/' hello.sh

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

#!/bin/bash 
#pwd 
#hostname 
#uname -a 
who 
who -r 
lsb_release -a

คำสั่ง Wc -l

คำสั่ง "wc -l" จะนับจำนวนบรรทัดที่มีอยู่ในไฟล์ นิพจน์ SED ต่อไปนี้จำลองเหมือนกัน

[jerry]$ sed -n '$ =' hello.sh

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

8

คำสั่งหัวหน้า

ตามค่าเริ่มต้นคำสั่ง head จะพิมพ์ 10 บรรทัดแรกของไฟล์ ให้เราจำลองพฤติกรรมเดียวกันกับ SED

[jerry]$ sed '10 q' books.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage
Paulo Coelho

คำสั่งหาง -1

"tail -1" จะพิมพ์บรรทัดสุดท้ายของไฟล์ ไวยากรณ์ต่อไปนี้แสดงการจำลอง

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1 
Line #2

ให้เราเขียนสคริปต์ SED

[jerry]$ sed -n '$p' test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #2

คำสั่ง Dos2unix

ในสภาพแวดล้อม DOS บรรทัดใหม่จะแสดงโดยการรวมกันของอักขระ CR / LF การจำลองคำสั่ง "dos2unix" ต่อไปนี้จะแปลงอักขระ DOS newline เป็นอักขระ UNIX ขึ้นบรรทัดใหม่ ใน GNU / Linux อักขระนี้มักถือว่าเป็นอักขระ "^ M" (Control M)

[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt 
[jerry]$ file test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

test.txt: ASCII text, with CRLF line terminators

ให้เราจำลองคำสั่งโดยใช้ SED

[jerry]$ sed 's/^M$//' test.txt > new.txt   # Press "ctrl+v" followed "ctrl+m" to generate 
"^M" character. 
[jerry]$ file new.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

new.txt: ASCII text

ตอนนี้ให้เราแสดงเนื้อหาของไฟล์

[jerry]$ cat -vte new.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1$ 
Line #2$

คำสั่ง Unix2dos

คล้ายกับ "dos2unix" มีคำสั่ง "unix2dos" ซึ่งแปลงอักขระ UNIX ขึ้นบรรทัดใหม่เป็นอักขระบรรทัดใหม่ของ DOS ตัวอย่างต่อไปนี้แสดงการจำลองสิ่งเดียวกัน

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ file test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

test.txt: ASCII text

ให้เราจำลองคำสั่งโดยใช้ SED

[jerry]$ sed 's/$/\r/' test.txt  > new.txt 
[jerry]$ file new.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

new.txt: ASCII text, with CRLF line terminators

ตอนนี้ให้เราแสดงเนื้อหาของไฟล์

Now let us display the file contents.

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1^M$ 
Line #2^M$

คำสั่ง Cat -E

คำสั่ง "cat -E" แสดงท้ายบรรทัดด้วยอักขระ Dollar ($) ตัวอย่าง SED ต่อไปนี้เป็นการจำลองแบบเดียวกัน

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat -E test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1$ 
Line #2$

ให้เราจำลองคำสั่งโดยใช้ SED

[jerry]$ sed 's|$|&$|' test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1$ 
Line #2$

คำสั่ง Cat -ET

คำสั่ง "cat -ET" จะแสดงสัญลักษณ์ Dollar ($) ที่ส่วนท้ายของแต่ละบรรทัดและแสดงอักขระ TAB เป็น "^ I" ตัวอย่างต่อไปนี้แสดงการจำลองคำสั่ง "cat -ET" โดยใช้ SED

[jerry]$ echo -e "Line #1\tLine #2" > test.txt 
[jerry]$ cat -ET test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1^ILine #2$

ให้เราจำลองคำสั่งโดยใช้ SED

[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1^ILine #2$

คำสั่ง nl

คำสั่ง "nl" เป็นเพียงตัวเลขบรรทัดของไฟล์ สคริปต์ SED ต่อไปนี้จำลองลักษณะการทำงานนี้

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

1 Line #1 
2 Line #2

นิพจน์ SED แรกจะพิมพ์หมายเลขบรรทัดตามด้วยเนื้อหาและนิพจน์ SED ที่สองจะรวมสองบรรทัดนี้และแปลงอักขระขึ้นบรรทัดใหม่เป็นอักขระ TAB

คำสั่ง cp

คำสั่ง "cp" รวบรวมสำเนาของไฟล์อื่น สคริปต์ SED ต่อไปนี้จำลองลักษณะการทำงานนี้

[jerry]$ sed -n 'w dup.txt' data.txt 
[jerry]$ diff data.txt dup.txt 
[jerry]$ echo $?

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

0

ขยายคำสั่ง

คำสั่ง "expand" แปลงอักขระ TAB เป็นช่องว่าง รหัสต่อไปนี้แสดงการจำลอง

[jerry]$ echo -e "One\tTwo\tThree" > test.txt 
[jerry]$ expand test.txt > expand.txt 
[jerry]$ sed 's/\t/     /g' test.txt > new.txt 
[jerry]$ diff new.txt expand.txt  
[jerry]$ echo $?

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

0

ทีคำสั่ง

คำสั่ง "tee" จะทิ้งข้อมูลไปยังสตรีมเอาต์พุตมาตรฐานเช่นเดียวกับไฟล์ ด้านล่างนี้เป็นการจำลองคำสั่ง "ที"

[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt  
Line #1 
Line #2

ให้เราจำลองคำสั่งโดยใช้ SED

[jerry]$ sed -n 'p; w new.txt' test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1 
Line #2

คำสั่ง cat -s

คำสั่ง UNIX "cat -s" ยับยั้งบรรทัดเอาต์พุตว่างที่ซ้ำกัน โค้ดต่อไปนี้แสดงการจำลองคำสั่ง "cat -s"

[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt  
[jerry]$ cat -s test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1  
Line #2
Line #3

ให้เราจำลองคำสั่งโดยใช้ SED

[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1  
Line #2  
Line #3

คำสั่ง grep

ตามค่าเริ่มต้นคำสั่ง "grep" จะพิมพ์บรรทัดเมื่อการจับคู่รูปแบบสำเร็จ รหัสต่อไปนี้แสดงการจำลอง

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep "Line #1" test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1

ให้เราจำลองคำสั่งโดยใช้ SED

[jerry]$ sed -n '/Line #1/p' test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #1

คำสั่ง grep -v

ตามค่าเริ่มต้นคำสั่ง "grep -v" จะพิมพ์บรรทัดเมื่อการจับคู่รูปแบบล้มเหลว รหัสต่อไปนี้แสดงการจำลอง

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep -v "Line #1" test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #2 
Line #3

ให้เราจำลองคำสั่งโดยใช้ SED

[jerry]$ sed -n '/Line #1/!p' test.txt

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

Line #2 
Line #3

tr คำสั่ง

คำสั่ง "tr" แปลอักขระ ด้านล่างคือการจำลอง

[jerry]$ echo "ABC" | tr "ABC" "abc"

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

abc

ให้เราจำลองคำสั่งโดยใช้ SED

[jerry]$ echo "ABC" | sed 'y/ABC/abc/'

ในการรันโค้ดด้านบนคุณจะได้ผลลัพธ์ดังต่อไปนี้:

abc