Perl: Rechercher et remplacer une chaîne précise dans plusieurs fichier texte
J'ai besoin pour obtenir tous les .fichier de configuration dans un répertoire donné et dans chacun de ces fichiers j'ai besoin de rechercher une chaîne spécifique et de le remplacer avec un autre basé sur le fichier.
Pour l'e.g si j'ai 3 fichier dans le répertoire donné:
for my_foo.config - string to search "fooCommon >" replace with "~ /fooCommon[\/>"
for my_bar.config - string to search "barCommon >" replace with "~ /barCommon[\/>"
for my_file.config - string to search "someCommon >" replace with "~ /someCommon[\/>"
S'il vous plaît laissez-moi savoir comment cela peut être fait en Perl?
Ci-dessous le code que j'ai essayé dans les scripts shell:
OLD="\/fooCommon >"
NEW="~ \"\/fooCommon[^\/]*\" >"
DPATH="/myhome/aru/conf/host*.conf"
BPATH="/myhome/aru/conf/bakup"
TFILE="/myhome/aru/out.tmp.$$"
[ ! -d $BPATH ] && mkdir -p $BPATH || :
for f in $DPATH
do
if [ -f $f -a -r $f ]; then
/bin/cp -f $f $BPATH
echo sed \"s\/$OLD\/$NEW\/g\"
sed "s/$OLD/$NEW/g" "$f" > $TFILE && mv $TFILE "$f"
else
echo "Error: Cannot read $f"
fi
done
/bin/rm $TFILE
Qu'avez-vous essayer?
j'ai essayé en script shell.. mais encore une fois je ne suis pas en mesure de déclarer le tableau pour string_to_search et string_to_match. Je suis totalement nouveau pour perl et shell script. Je vais poster mon script shell ici
Veuillez mettre à jour votre post au lieu de cela plutôt que de faire des commentaires au sujet de votre tente.
j'ai essayé en script shell.. mais encore une fois je ne suis pas en mesure de déclarer le tableau pour string_to_search et string_to_match. Je suis totalement nouveau pour perl et shell script. Je vais poster mon script shell ici
Veuillez mettre à jour votre post au lieu de cela plutôt que de faire des commentaires au sujet de votre tente.
OriginalL'auteur user2589079 | 2013-11-15
Vous devez vous connecter pour publier un commentaire.
Si vous êtes sous Unix comme plate-forme, vous pouvez le faire à l'aide de Perl sur la ligne de commande; pas besoin d'écrire un script.
POUR être sur le côté plus sûr, vous pouvez utiliser la commande avec l'option de sauvegarde.
mes exigences est différente voir l'exemple dans ma question.
OriginalL'auteur Pankaj Vaidya
Perl ici est juste de modifier des fichiers... je ne comprends pas pourquoi l'écrire tout en perl, si vous pouvez faire beaucoup plus simple comme ceci:
est-il possible d'obtenir le nom du fichier en tant que variable dans le script ci-dessus ?
OriginalL'auteur jirib
Dans le cas où vous avez vraiment besoin de faire cela avec perl seulement, que je ne recommande pas car il y a d'excellents et des réponses simples et déjà placé, va ici:
Veuillez noter que le faire avec de simples à trouver et ou les caractères génériques du shell est beaucoup plus simple. Mais, prendre cela comme un petit tutoriel sur la façon de traiter les fichiers avec perl de toute façon.
OriginalL'auteur Sami Laine
Alors qu'il peut être fait à partir de la ligne de commande, parfois, vous voulez juste avoir un facilement utilisable script qui fournit un peu plus d'une sortie utile. Avec cela à l'esprit, ici, c'est un perl solution à l'amiable de sortie pour toute personne qui traverse cette question.
OriginalL'auteur simpleuser
Peut-être le suivant sera utile:
Un hachage de tableaux (HoA) est construit par
split
ting la|
délimité par des lignes de DONNÉES, où la clé est le nom de fichier et la valeur est une référence à un anonyme, un tableau dont les deux éléments sont pour la substitution sur le fichier. Lelocal $^I = '.bak'
notation crée des sauvegardes des fichiers d'origine.Vous devrez peut-être ajuster la substitution. Par exemple, les limites de word sont observées dans la substitution en utilisant
\b
danss/\b\Q$replacements{$file}[0]/$replacements{$file}[1]/g;
. Vous pouvez ou ne pouvez pas besoin (ou envie).Je vous suggère de l'essayer sur un seul 'scratch' déposer d'abord, pour s'assurer que vous obtenez les résultats que vous voulez, avant de mettre pleinement en œuvre, même si les fichiers d'origine sont sauvegardés.
OriginalL'auteur Kenosis
Votre script est une bonne tentative.
Il contient quelques redondances:
cp
$f
$TFILE
est inutile (il suffit d'écrire lesed
de sortie pour le fichier cible directement)Vous pouvez construire
$NEW
et le nom de fichier cible de la valeur de$f
sans le chemin d'accès au répertoire, que vous pouvez obtenir comme suit:OriginalL'auteur reinierpost