How to edit multiple text files with a single command?

You can use sed :

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

This will replace the first line of all .txt files in the current directory with the text new line, change it to meet your need.

Also the original files will be backed up with .bak extension, if you don't want that just use :

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

Well, using vim itself:

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

What this does:

  • setline (n, text), well, is a function that sets line n to text.
  • call is needed to call functions.
  • bufdo is used to repeat a command across buffers (without a range, it acts on all buffers).
  • wq saves and quits the buffer. We need to do this before moving on to the next buffer, so this command is chained to the call command using |.
  • -c cmd runs cmd is a command-mode command after loading the first buffer.
  • Nes turns on no-compatible, silent, ex-mode, which is better for non-interactive processing.

Benefits:

  • The setline text content can be anything - an & in a sed replacement text can have unintended effects.

A few other options:

  • awk (needs a relatively new version of 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
    
  • Shell/coreutils

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