Comment éditer plusieurs fichiers texte avec une seule commande?

18

Je souhaite supprimer la première ligne de plusieurs fichiers texte et la remplacer par une autre ligne. Existe-t-il un moyen de le faire en utilisant le terminal?

Je sais comment utiliser vim, existe-t-il un moyen de l'automatiser avec? Je veux éviter de le faire manuellement (comme lors de l'édition de chaque fichier individuellement).

Si possible, je voudrais éviter d'installer de nouvelles bibliothèques (surtout pour quelque chose comme ça que je considère très simple - mais je peux me tromper).

Merci d'avance!

TomTsagk
la source

Réponses:

21

Vous pouvez utiliser sed:

sed -i.bak '1s/^.*$/new line/' *.txt

Cela remplacera la première ligne de tous les .txtfichiers du répertoire actuel par le texte new line, changez-le pour répondre à vos besoins.

De plus, les fichiers originaux seront sauvegardés avec l' .bakextension, si vous ne voulez pas simplement utiliser:

sed -i '1s/^.*$/new line/' *.txt
heemayl
la source
Je vous remercie! sedest en fait ce que je cherchais!
TomTsagk
@TomTsagk Heureux d'avoir pu aider :)
heemayl
11

Eh bien, en utilisant vimlui-même:

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

Ce que cela fait:

  • setline (n, text), eh bien, est une fonction qui définit la ligne nsur text.
  • call est nécessaire pour appeler des fonctions.
  • bufdo est utilisé pour répéter une commande à travers les tampons (sans plage, il agit sur tous les tampons).
  • wqenregistre et quitte le tampon. Nous devons le faire avant de passer au tampon suivant, donc cette commande est chaînée à la callcommande using |.
  • -c cmdruns cmdest une commande en mode commande après le chargement du premier tampon.
  • Nes active le mode ex non compatible, silencieux, ce qui est préférable pour le traitement non interactif.

Avantages:

  • Le setlinecontenu du texte peut être quelque chose - un &dans un sedtexte de remplacement peut avoir des effets inattendus.
muru
la source
sedsemble beaucoup plus facile à utiliser, mais c'est vraiment génial qui vimpeut faire la même chose! Merci beaucoup pour votre réponse!
TomTsagk
@TomTsagk bien, je voulais juste illustrer comment vous pourriez agir sur plusieurs fichiers ( bufdo). Considérez que vous avez les fichiers déjà ouverts et ... Et pour montrer une alternative à 1s/foo/bar/.
muru
Awesoming !!! <3_ <3
Campa
3

Quelques autres options:

  • awk(nécessite une version relativement nouvelle de GNU awk)

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Perl / shell

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • Coquille / coreutils

    $ for f in *txt; do 
        ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; 
      done
    
terdon
la source
2

Ce script fera ce que vous avez demandé, en plaçant les fichiers modifiés dans un nouveau répertoire sans changer réellement les originaux.

d=/tmp/cooked
mkdir $d
for f in *  #will match all files in current directory; adjust as desired
do
  echo "This is the new 1st line" > /${d}/${f}
  sed 1d ${f} >> /${d}/${f}
done
Charles Boling
la source
J'ai répondu lentement (testé mon code) ... et j'aime beaucoup mieux la solution de heemayl!
Charles Boling
0

En utilisant gawk

gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

Exemple

% cat foo.txt 
1
2
3
4

% cat bar.txt 
1
2
3
4

% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt                                                    
your_replacement
2
3
4

% cat bar.txt                                                    
your_replacement
2
3
4
UN B
la source
0

jEdit: Je l'utilise pour trouver et remplacer en masse. Il est puissant avec la possibilité d'utiliser RegEx - Expressions régulières. Vous pouvez opérer sur des fichiers dans un répertoire, spécifier des extensions de fichier, par exemple, ".html" et ainsi de suite. Et, vous pouvez regarder les paramètres régionaux du changement de candidat dans le contexte, dans une interface graphique. jEdit est super.

jEdit est disponible via le centre de logiciels d'Ubuntu.

Roger
la source
0

Les commandes tail et cat le feraient facilement:

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

Enveloppez-les dans une boucle appropriée et utilisez peut-être un fichier temporaire approprié et juste au lieu d'un nom de fichier temporaire codé en dur. Je crois que bash et d'autres shells ont une syntaxe pour créer des fichiers temporaires.

L'option -n de tail a deux interprétations selon que l'argument a un signe plus. S'il a un signe plus, cela signifie afficher la queue du fichier à partir du numéro de ligne donné. Sinon, le nombre est le nombre de lignes, y compris la dernière ligne, que la queue est censée produire.

homme de l'espace cardiff
la source