ใช่มีหลายวิธีในการทำเช่นนี้ คุณสามารถใช้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, นอกจากนั้นเครื่องมือและภาษาจำนวนมากยังสามารถทำการแทนที่สตริงข้อความธรรมดาได้ ดังนั้นคำถามของคุณค่อนข้างกว้าง