Jak edytować wiele plików tekstowych za pomocą jednego polecenia?


18

Chcę usunąć pierwszy wiersz z wielu plików tekstowych i zastąpić go innym wierszem. Czy można to zrobić za pomocą terminala?

Wiem, jak korzystać z vima, czy istnieje sposób na zautomatyzowanie go? Chcę uniknąć robienia tego ręcznie (jak w przypadku edycji każdego pliku osobno).

Jeśli to możliwe, chciałbym uniknąć instalowania nowych bibliotek (szczególnie dla czegoś takiego, co uważam za bardzo proste - ale mogę się mylić).

Z góry dziękuję!

Odpowiedzi:


21

Możesz użyć sed:

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

Spowoduje to zastąpienie pierwszego wiersza wszystkich .txtplików w bieżącym katalogu tekstem new line, zmień go zgodnie z potrzebami.

Kopia zapasowa również zawiera oryginalne pliki z .bakrozszerzeniem, jeśli nie chcesz tego, użyj:

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

Dziękuję Ci! sedjest właśnie tym, czego szukałem!
TomTsagk

@TomTsagk Cieszę się, że mogłem pomóc :)
heemayl

11

Cóż, używając vimsiebie:

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

Co to robi:

  • setline (n, text), cóż, jest funkcją, która ustawia linię nna text.
  • call jest potrzebny do wywoływania funkcji.
  • bufdo służy do powtarzania polecenia między buforami (bez zakresu działa na wszystkie bufory).
  • wqzapisuje i zamyka bufor. Musimy to zrobić przed przejściem do następnego bufora, więc to polecenie jest powiązane z callpoleceniem za pomocą |.
  • -c cmdRun cmdto polecenie trybu poleceń po załadowaniu pierwszego bufora.
  • Nes włącza tryb niekompatybilny, cichy, ex, co jest lepsze w przypadku przetwarzania nieinteraktywnego

Korzyści:

  • Treść setlinetekstowa może być dowolna - &w sedtekście zastępczym może mieć niezamierzone efekty.

sedwydaje się znacznie łatwiejszy w użyciu, ale to naprawdę niesamowite, że vimmożna zrobić to samo! Wielkie dzięki za odpowiedź!
TomTsagk

@TomTsagk dobrze, chciałem tylko zilustrować sposób działania wielu plików ( bufdo). Rozważ, że masz już otwarte pliki i ... I pokaż alternatywną opcję 1s/foo/bar/.
muru

Awesoming !!! <3_ <3
Campa

3

Kilka innych opcji:

  • awk(potrzebuje stosunkowo nowej wersji 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
    

2

Ten skrypt wykona polecenie, umieszczając zmienione pliki w nowym katalogu bez faktycznej zmiany oryginałów.

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

Odpowiadałem powoli (przetestowałem mój kod) ... i znacznie bardziej podoba mi się rozwiązanie heemayl!
Charles Boling

0

Za pomocą gawk

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

Przykład

% 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

0

jEdit: używam go do masowego wyszukiwania i zamiany. Jest potężny z możliwością używania RegEx - wyrażeń regularnych. Możesz operować na plikach w katalogu, określać rozszerzenia plików, np. „.Html” i tak dalej. I możesz zobaczyć lokalizację zmiany kandydata w kontekście, w GUI. jEdit jest świetny.

jEdit jest dostępny za pośrednictwem centrum oprogramowania Ubuntu.


0

Polecenia ogon i kot zrobiłyby to łatwo:

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

Zawiń je w odpowiednią pętlę i być może użyj odpowiedniego i prawego pliku tymczasowego zamiast na stałe zakodowanej nazwy pliku tymczasowego. Wierzę, że bash i inne powłoki mają składnię do tworzenia plików tymczasowych.

Opcja -n tail ma dwie interpretacje w zależności od tego, czy argument ma znak plus. Jeśli ma znak plus, oznacza to pokazanie końca pliku zaczynającego się od podanego numeru linii. W przeciwnym razie liczba to liczba wierszy, w tym ostatni wiersz, który ma wyprowadzić ogon.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.