ใช่มีหลายวิธีในการทำเช่นนี้ คุณสามารถใช้awk
, perl
หรือbash
จะทำกิจกรรมเหล่านี้เช่นกัน โดยทั่วไปแล้วsed
อาจเป็นเครื่องมือที่มีประโยชน์มากที่สุดสำหรับการทำงานประเภทนี้
ตัวอย่าง
ว่าฉันมีข้อมูลตัวอย่างนี้ในไฟล์data.txt
:
foo bar 12,300.50
foo bar 2,300.50
abc xyz 1,22,300.50
awk
$ awk '{gsub("foo", "foofoofoo", $0); print}' data.txt
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50
Perl
$ perl -pe "s/foo/foofoofoo/g" data.txt
foofoofoo bar 12,300.50
foofoofoo bar 2,300.50
abc xyz 1,22,300.50
การแก้ไขแบบอินไลน์
ตัวอย่างข้างต้นสามารถแก้ไขไฟล์ได้โดยตรง ตัวอย่าง Perl เป็นเรื่องเล็กน้อย เพียงเพิ่ม-i
สวิตช์
$ perl -pie "s/foo/foofoofoo/g" data.txt
สำหรับawk
โดยตรงน้อยกว่าเล็กน้อย แต่มีประสิทธิภาพเท่า:
$ { rm data.txt && awk '{gsub("foo", "foofoofoo", $0); print}' > data.txt; } < data.txt
วิธีนี้จะสร้าง sub-shell ที่มีเครื่องหมายปีกกา '{... } `ซึ่งมีการเปลี่ยนเส้นทางไฟล์ไปที่นี่:
$ { ... } < data.txt
เมื่อไฟล์ถูกเปลี่ยนเส้นทางไปที่ sub-shell แล้วไฟล์นั้นจะถูกลบและawk
จะทำงานกับเนื้อหาของไฟล์ที่อ่านเข้าไปใน sub-shells STDIN เนื้อหานี้จะถูกประมวลผลโดยawk
และเขียนออกไปเป็นชื่อไฟล์เดียวกับที่เราเพิ่งลบไปแทนที่มันได้อย่างมีประสิทธิภาพ
$var=~s/a/b/g
แต่มีไวยากรณ์ต่างๆ:gsub(/a/,"b",var)
,var.gsub(/a/,'b')
,var.replace(/a/g,'b')
,preg_replace("/a/","b",$var)
,regsub -all a b $var
, นอกจากนั้นเครื่องมือและภาษาจำนวนมากยังสามารถทำการแทนที่สตริงข้อความธรรมดาได้ ดังนั้นคำถามของคุณค่อนข้างกว้าง