ฉันมีสองไฟล์หนึ่งเก็บรายการของรูปแบบอื่นต้องเปลี่ยนตามรูปแบบเหล่านี้ จนถึงตอนนี้ฉันได้ทำการทดลองกับ
cat patterns.txt| xargs -n1| sed 's/patternfromfile/subtitution/'
แต่ฉันไม่แน่ใจว่าจะป้อน xargs ลงใน 's / here //' ได้อย่างไร
ขอบคุณ
ฉันมีสองไฟล์หนึ่งเก็บรายการของรูปแบบอื่นต้องเปลี่ยนตามรูปแบบเหล่านี้ จนถึงตอนนี้ฉันได้ทำการทดลองกับ
cat patterns.txt| xargs -n1| sed 's/patternfromfile/subtitution/'
แต่ฉันไม่แน่ใจว่าจะป้อน xargs ลงใน 's / here //' ได้อย่างไร
ขอบคุณ
คำตอบ:
คุณอาจต้องการตัวเลือก -i เพื่อ xargs (ตรวจสอบรายละเอียด man page) ที่สำคัญแทนที่{}
ด้วยรูปแบบและเรียกใช้คำสั่งหนึ่งครั้งต่อรูปแบบ ดังนั้นมันจะทำงานบนไฟล์หนึ่งครั้งต่อรูปแบบ คุณจะต้องจำไว้ว่าเมื่อสร้างรูปแบบของคุณ
user@host [/tmp]$ cat patterns
a
[pd]ie
user@host [/tmp]$ cat file
hat
cherry pie
die alone
eat cake
user@host [/tmp]$ cat patterns | xargs -i sed 's/{}/moo/' file
hmoot
cherry pie
die moolone
emoot cake
hat
cherry moo
moo alone
eat cake
หรือคุณสามารถใช้อย่างอื่นเพื่อสร้างสคริปต์แบบไดนามิกจากไฟล์รูปแบบของคุณ ตัวอย่างเช่นคุณสามารถใช้ sed บนไฟล์รูปแบบของคุณเพื่อปรับใช้ทั้งหมดในการส่งผ่านไฟล์ครั้งเดียว :)
user@host [/tmp]$ sed 's|^|s/|;s|$|/moo/;|' patterns | tee patterns.sed
s/a/moo/;
s/[pd]ie/moo/;
user@host [/tmp]$ sed -f patterns.sed file
hmoot
cherry moo
moo moolone
emoot cake
คุณไม่รู้ว่าคุณมีรูปแบบใด:
ใช้ตัวเลือก -i หากคุณต้องการแก้ไข yourfile โดยตรง:
while read pattern
do
sed -i 's/"${pattern}"/substitution/' yourfile
done < patterns.txt
หรือเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ใหม่:
while read pattern
do
sed 's/"${pattern}"/substitution/' yourfile >> outfile
done < patterns.txt
คุณสามารถสร้าง regex ดังนี้:
regex=$(tr '\n' '|' < patterns.txt)
sed -ri "s/$regex/replacement/" filename
คุณอาจเลือกที่จะเพิ่มการตั้งค่าสถานะ "g" ลงในคำสั่ง s ///