GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Mehrere Dateitexte durch Sed ersetzen?

Ich versuche einige Texte in Textdateien durch sed zu ersetzen weiß aber nicht, wie man das mit mehreren Dateien macht.
Ich verwende:

sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g /path/to/file/target_text_file

Bevor ich mit den mehreren Dateien gehe, habe ich die Pfade der Zieltextdateien mit diesem Befehl in einer Textdatei gedruckt:

find /path/to/files/ -name "target_text_file" > /home/user/Desktop/target_files_list.txt

Jetzt möchte ich sed ausführen gemäß target_files_list.txt .

Akzeptierte Antwort:

Sie können die Datei mit while ... do durchlaufen Schleife:

$ while read i; do printf "Current line: %s\n" "$i"; done < target_files_list.txt

In Ihrem Fall sollten Sie printf ... ersetzen mit sed gewünschten Befehl.

$ while read i; do sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g' "$i"; done < target_files_list.txt

Beachten Sie jedoch, dass Sie mit find erreichen können, was Sie wollen :

$ find /path/to/files/ -name "target_text_file" -exec sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g' {} \;

Sie können mehr über -exec lesen Option durch Ausführen von man find | less '+/-exec ' :

   -exec command ;

          Execute command; true if 0 status is returned.  All
          following arguments to find are taken to be arguments to
          the command until an argument consisting of `;' is
          encountered.  The string `{}' is replaced by the current
          file name being processed everywhere it occurs in the
          arguments to the command, not just in arguments where it
          is alone, as in some versions of find.  Both of these
          constructions might need to be escaped (with a `\') or
          quoted to protect them from expansion by the shell.  See
          the EXAMPLES section for examples of the use of the
          -exec option.  The specified command is run once for
          each matched file.  The command is executed in the
          starting directory.  There are unavoidable security
          problems surrounding use of the -exec action; you should
          use the -execdir option instead.

BEARBEITEN:

Wie von den Benutzern terdon und dessert in den Kommentaren richtig bemerkt,
ist es notwendig, -r zu verwenden mit read weil es korrekt mit Backslashes umgeht. Es wird auch von shellcheck gemeldet :

$ cat << EOF >> do.sh
#!/usr/bin/env sh
while read i; do printf "$i\n"; done < target_files_list.txt
EOF
$ ~/.cabal/bin/shellcheck do.sh

In do.sh line 2:
while read i; do printf "\n"; done < target_files_list.txt
      ^-- SC2162: read without -r will mangle backslashes.

Also sollte es sein:

$ while read -r i; do sed -i -- 's/SOME_TEXT/SOME_TEXT_TO_REPLACE/g' "$i"; done < target_files_list.txt

Ubuntu
  1. Ersetzen Sie intelligente Anführungszeichen durch den Linux-Befehl sed

  2. Wie ersetze ich eine Zeichenfolge in einer oder mehreren Dateien?

  3. Wie verwendet man Sed oder Ex, um einen Block (mehrzeiliger Code) durch einen neuen Textblock (Code) zu ersetzen?

  4. Wie ersetzt man sed wie Text durch Python?

  5. Wie ersetze ich eine Datei im JAR durch die Befehlszeile in Linux?

Linux-WC-Befehl mit Beispielen

So lesen Sie eine Datei mit Leerzeichen in Linux

Bearbeiten von Text mit sed und grep

So kopieren Sie eine Datei mit einem Befehl in mehrere Verzeichnisse unter Linux

Konvertieren Sie mit eSpeak auf Ubuntu Text in Sprache

Ist es mit Gedit oder der Befehlszeile möglich, jede vierte Zeile einer Textdatei zu ändern?