ฉันต้องการทราบวิธีการค้นหาและแทนที่ข้อความที่ระบุในหลายไฟล์เช่นใน Notepad ++ ในบทช่วยสอนที่เชื่อมโยง
ฉันต้องการทราบวิธีการค้นหาและแทนที่ข้อความที่ระบุในหลายไฟล์เช่นใน Notepad ++ ในบทช่วยสอนที่เชื่อมโยง
คำตอบ:
ที่นี่ฉันใช้ sed เพื่อแทนที่ทุกคำที่เกิดขึ้น "cybernetnews" กับ "cybernet" ในทุก ๆ ไฟล์ที่มีนามสกุล, c, ในไดเรกทอรี, / home / user / directory /
find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;
ชุดรูปแบบทั่วไปเพิ่มเติมที่คุณค้นหาซ้ำจากไดเรกทอรีของการดำเนินการและดำเนินการในไฟล์ปกติเท่านั้นอ่านได้เขียนได้:
find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
cyber net news
? ฉันจะแปลงนี้เพื่อcyber net
?
ตัวแก้ไขสตรีม, sed เป็นเครื่องมือที่มีประสิทธิภาพสำหรับงานประเภทนี้และเป็นตัวเลือกแรกของฉันอย่างไรก็ตามถ้าคุณต้องการทำสิ่งนี้จากโปรแกรมแก้ไขข้อความธรรมดาโดยใช้แอพพลิเคชั่นพื้นฐานของ Ubuntu ฉันขอแนะนำให้คุณดู Jedit , มันมีอยู่ในที่เก็บและสามารถติดตั้งได้โดยพิมพ์ในคอนโซลของคุณ:
sudo apt-get install jedit
เริ่ม jedit คลิกรายการเมนูค้นหาในรายการเมนูคลิกรายการค้นหาในไดเรกทอรีคุณจะเห็นกล่องโต้ตอบด้านล่าง:
สิ่งนี้คล้ายกับ Notepad ++ และทำสิ่งเดียวกันฉันเชื่อว่านี่คือสิ่งที่คุณต้องการ
sed
พิเศษถ้าฉันได้ทำในสิ่งเดียวกันกับ
ตัวเลือก GUI อื่นคือregexxer :
perl -pi -e 's/oldtext/newtext/g' *
แทนที่การเกิดขึ้นของ oldtext ใด ๆ โดย newtext ในไฟล์ทั้งหมดในโฟลเดอร์ปัจจุบัน อย่างไรก็ตามคุณจะต้องหลบหลีกอักขระพิเศษทั้งหมดใน oldtext และ newtext โดยใช้เครื่องหมายแบ็กสแลช
ตรวจสอบกับGeanyเป็น NPP ที่สมบูรณ์แบบสำหรับการแทนที่ Linux คุณสามารถทำสิ่งนั้นได้อย่างสมบูรณ์และคุณสามารถใช้ regex ได้
ฉันเขียนสคริปต์เล็กน้อยเพื่อสิ่งนี้ หากคุณต้องการแค่พื้นฐานและไม่คุ้นเคยกับการใช้งานอื่น ๆ ลองดูที่นี่: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in -a ตั้งของไฟล์ /
สคริปต์มีดังต่อไปนี้:
for f in submit_*;
do sed "s/old_db_name/new_db_name/" < $f > a_$f ;
mv a_$f $f ;
done
find_and_replace_in_files.sh
คุณสามารถใช้สคริปต์นี้คัดลอกโค้ดและทำให้ไฟล์
ฉันแก้ไขมันเล็กน้อย กรุณาบอกความคิดเห็นของคุณ
# *****************************************************************************************
# find_and_replace_in_files.sh
# This script does a recursive, case sensitive directory search and replace of files
# To make a case insensitive search replace, use the -i switch in the grep call
# uses a startdirectory parameter so that you can run it outside of specified directory - else this script will modify itself!
# *****************************************************************************************
!/bin/bash
# **************** Change Variables Here ************
startdirectory="/your/start/directory"
searchterm="test"
replaceterm="test=ok!"
# **********************************************************
echo "***************************************************"
echo "* Search and Replace in Files Version 01-Aug-2012 *"
echo "***************************************************"
i=0;
for file in $(grep -l -R $searchterm $startdirectory)
do
cp $file $file.bak
sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp
mv tempfile.tmp $file
let i++;
echo "Modified: " $file
done
echo " *** All Done! *** Modified files:" $i
SearchMonkey เป็นแอปพลิเคชั่น Gtk ที่มีน้ำหนักเบาซึ่งมีจุดมุ่งหมายเพื่อแทนที่การค้นหา / grep ที่ยุ่งยากด้วยส่วนต่อประสานผู้ใช้ที่ลื่นไหลซึ่งให้ตำแหน่งที่แสดงเครื่องหมายและปริมาณของข้อความที่ตรงกันได้อย่างรวดเร็ว เป้าหมายคือการจัดหาเครื่องมือค้นหาที่ใช้งานง่ายและสามารถเข้าถึงได้สำหรับผู้ใช้งานและนักพัฒนาซอฟต์แวร์
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"
ทำงานกับฉันใน fedora
sed
! ดังนั้นจึงเร็วกว่ามากในแง่ของเวลา CPU เนื่องจากเวลาในการเข้าถึงไฟล์จะ จำกัด ฉันคิดว่ามันไม่เร็วกว่าเวลานาฬิกา แต่ให้โหลดระบบน้อยลง หมายเหตุxargs
จะใส่ชื่อไฟล์จำนวนมากเช่นเดียวกับนักล่าใน commandline ของsed
คำสั่งเดียว- เติมขนาดบัฟเฟอร์ที่มีอยู่ตามความยาวของพา ธ
+
แทน\;
ในfind
ใช่มั้ย?
xargs
แต่คุณพูดถูก; จากman find
: ...-exec command {} +
The command line is built in much the same way that xargs...
ทำให้ฉันคิดถึงบรรทัดคำสั่งของgit filter-branch
... ;)
ทางออกที่ง่ายมาก: แทนที่*.txt
ไฟล์ทั้งหมดในโฟลเดอร์string_1
ด้วยstring_2
:
sed -i 's/string_1/string_2/g' *.txt
sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)