Chcę wiedzieć, jak znaleźć i zamienić określony tekst w wielu plikach, takich jak Notepad ++ w połączonym samouczku.
Chcę wiedzieć, jak znaleźć i zamienić określony tekst w wielu plikach, takich jak Notepad ++ w połączonym samouczku.
Odpowiedzi:
Tutaj używam sed, aby zastąpić każde wystąpienie słowa „cybernetnews” słowem „cybernet” w każdym pliku z rozszerzeniem, c, w katalogu / home / user / directory /.
find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;
Bardziej ogólna odmiana, w której wyszukiwanie odbywa się rekurencyjnie z katalogu wykonania i działa tylko na zwykłych, czytelnych i zapisywalnych plikach:
find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
cyber net news
? Jak mogę to przekonwertować cyber net
?
Edytor strumieniowy, sed, jest potężnym narzędziem do tego rodzaju pracy i jest moim pierwszym wyborem, jednak jeśli chcesz to zrobić ze zwykłego edytora tekstowego przy użyciu natywnej aplikacji opartej na Ubuntu, proponuję spojrzeć na Jedit , Jest dostępny w repozytoriach i można go zainstalować, wpisując w konsoli:
sudo apt-get install jedit
Uruchom jedit, kliknij pozycję menu wyszukiwania, na liście menu kliknij pozycję Szukaj w katalogu, zostanie wyświetlone poniższe okno dialogowe:
Jest podobny do Notepad ++ i robi to samo, wierzę, że tego właśnie chcesz.
sed
.
Inną opcją GUI jest regexxer :
perl -pi -e 's/oldtext/newtext/g' *
zastępuje każde wystąpienie oldtext przez newtext we wszystkich plikach w bieżącym folderze. Jednak będziesz musiał uciec od wszystkich znaków specjalnych Perla w oldtext i newtext za pomocą odwrotnego ukośnika.
Sprawdź u Geany , jest to idealny zamiennik NPP dla Linuksa. Możesz zrobić dokładnie to, plus możesz użyć wyrażenia regularnego.
Napisałem mały skrypt dla tej rzeczy. Jeśli potrzebujesz tylko podstaw i nie znasz sed itp, zajrzyj tutaj: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in -a-zbiór plików /
Skrypt jest następujący:
for f in submit_*;
do sed "s/old_db_name/new_db_name/" < $f > a_$f ;
mv a_$f $f ;
done
Możesz użyć tego skryptu, skopiować kod i utworzyć plik find_and_replace_in_files.sh
.
Trochę go zmodyfikowałem; proszę powiedz mi swoją opinię.
# *****************************************************************************************
# 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
Innym programem jest Searchmonkey .
SearchMonkey to lekka aplikacja Gtk, której celem jest zastąpienie kłopotliwego find / grep eleganckim interfejsem użytkownika, który szybko zapewnia znaczniki pokazujące lokalizacje i liczbę dopasowanych tekstów. Celem jest zapewnienie prostego w użyciu i dostępnego narzędzia wyszukiwania dla użytkowników końcowych i twórców oprogramowania.
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"
działa dla mnie na Fedorze
sed
instancji! Jest więc znacznie szybszy pod względem czasu procesora. Ponieważ czas dostępu do pliku byłby ograniczony, myślę, że nie jest on znacznie szybszy w czasie, ale daje mniejsze obciążenie systemu. Uwaga xargs
umieści wiele wierszy nazw plików w sed
wierszu polecenia pojedynczego polecenia - wypełniając dostępny rozmiar bufora na podstawie długości ścieżek.
+
zamiast \;
w find
, prawda?
xargs
, ale masz rację; z man find
: -exec command {} +
... The command line is built in much the same way that xargs...
. Przypomina mi się wiersze poleceń git filter-branch
...;)
To bardzo proste rozwiązanie: zastąpić w wszystkie *.txt
pliki w folderze string_1
z string_2
:
sed -i 's/string_1/string_2/g' *.txt
sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)