Ich möchte wissen, wie ich einen bestimmten Text in mehreren Dateien wie in Notepad ++ im verknüpften Lernprogramm finden und ersetzen kann.
Ich möchte wissen, wie ich einen bestimmten Text in mehreren Dateien wie in Notepad ++ im verknüpften Lernprogramm finden und ersetzen kann.
Antworten:
Hier benutze ich sed, um jedes Vorkommen des Wortes "cybernetnews" durch "cybernet" in jeder Datei mit der Erweiterung "c" im Verzeichnis "/ home / user / directory /" zu ersetzen.
find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;
Eine allgemeinere Variante, bei der Sie rekursiv aus dem Ausführungsverzeichnis suchen und nur mit regulären, lesbaren und beschreibbaren Dateien arbeiten:
find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
cyber net news
? Wie kann ich das konvertieren cyber net
?
Der Stream-Editor sed ist ein leistungsstarkes Dienstprogramm für diese Art von Arbeit und meine erste Wahl. Wenn Sie dies jedoch in einem normalen Texteditor mit einer Ubuntu-basierten nativen Anwendung tun möchten, sollten Sie sich Jedit ansehen , Es ist in den Repositorys verfügbar und kann installiert werden, indem Sie Folgendes in Ihre Konsole eingeben:
sudo apt-get install jedit
Starten Sie jedit, klicken Sie auf den Menüpunkt Suchen, klicken Sie in der Menüliste auf den Menüpunkt Im Verzeichnis suchen. Der folgende Dialog wird angezeigt:
Dies ähnelt dem von Notepad ++ und macht dasselbe, ich glaube, das ist, was Sie wollen.
sed
.
Eine andere GUI-Option ist regexxer :
Fragen Sie bei Geany nach , es ist der perfekte NPP-Ersatz für Linux. Sie können genau das tun und Sie können Regex verwenden.
Ich habe ein kleines Skript für genau dieses Ding geschrieben. Wenn Sie nur die Grundlagen benötigen und nicht mit sed usw. vertraut sind, schauen Sie hier: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in -ein-satz-von-dateien /
Das Skript lautet wie folgt:
for f in submit_*;
do sed "s/old_db_name/new_db_name/" < $f > a_$f ;
mv a_$f $f ;
done
Sie können dieses Skript verwenden, Code kopieren und eine Datei erstellen find_and_replace_in_files.sh
.
Ich habe es ein wenig modifiziert; Bitte sag mir deine Meinung.
# *****************************************************************************************
# 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
Ein anderes Programm ist Searchmonkey .
SearchMonkey ist eine leichte Gtk-Anwendung, mit der das umständliche Suchen / Suchen durch eine übersichtliche Benutzeroberfläche ersetzt werden soll, die schnell eine Markierung mit den Positionen und der Anzahl der Textübereinstimmungen enthält. Ziel ist es, Endbenutzern und Softwareentwicklern ein einfach zu bedienendes und zugängliches Suchwerkzeug zur Verfügung zu stellen.
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"
arbeitet für mich auf Fedora
sed
Instanzen ausgeführt! Es ist also viel schneller in Bezug auf die CPU-Zeit. Da die Dateizugriffszeit begrenzt wäre, denke ich, dass die Uhrzeit nicht viel schneller ist, aber eine geringere Systemlast ergibt. Note xargs
fügt wie Hunderte von Dateinamen in die sed
Befehlszeile eines einzelnen Befehls ein und füllt die verfügbare Puffergröße basierend auf der Länge der Pfade.
+
statt \;
in find
, nicht wahr?
xargs
, aber du hast recht; von man find
: -exec command {} +
: ... The command line is built in much the same way that xargs...
. Erinnert mich an Befehlszeilen von git filter-branch
...;)
Eine sehr einfache Lösung: Ersetzen Sie in allen *.txt
Dateien im Ordner string_1
durch string_2
:
sed -i 's/string_1/string_2/g' *.txt
sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)