Як редагувати кілька текстових файлів за допомогою однієї команди?


18

Я хочу видалити перший рядок з декількох текстових файлів і замінити його іншим рядком. Чи можна це зробити за допомогою терміналу?

Я знаю, як використовувати vim, чи є спосіб його автоматизувати? Я хочу уникати цього робити вручну (як при редагуванні кожного файлу окремо).

Якщо можливо, я хотів би уникати встановлення нових бібліотек (особливо для чогось такого, що я вважаю дуже простим - але я можу помилитися).

Спасибі заздалегідь!

Відповіді:


21

Ви можете використовувати sed:

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

Це замінить перший рядок усіх .txtфайлів у поточному каталозі текстом new line, змінить його відповідно до ваших потреб.

Також оригінальні файли будуть резервні копії .bakрозширення, якщо ви цього не бажаєте просто використовувати:

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

Дякую! sedнасправді те, що я шукав!
TomTsagk

@TomTsagk Радий, що можу допомогти :)
heemayl

11

Ну, використовуючи vimсебе:

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

Що це робить:

  • setline (n, text), ну, це функція, яка задає рядок nдо text.
  • call потрібен для виклику функцій.
  • bufdo використовується для повторення команди через буфери (без діапазону, вона діє на всі буфери).
  • wqзберігає і закриває буфер. Нам потрібно це зробити, перш ніж перейти до наступного буфера, тому ця команда прикута до callкоманди, що використовує |.
  • -c cmdrun cmd- це команда командного режиму після завантаження першого буфера.
  • Nes вмикає не сумісний, безшумний, колишній режим, що краще для неінтерактивної обробки.

Переваги:

  • setlineЗміст тексту може бути будь-яким - &в sedтексті заміни може мати непередбачувані наслідки.

sedздається набагато простішим у використанні, але це дійсно приголомшливо, що vimможна зробити те ж саме! Дякую за вашу відповідь!
TomTsagk

@TomTsagk добре, я просто хотів проілюструвати, як можна діяти в декількох файлах ( bufdo). Подумайте, що файли вже відкриті і ... І показати альтернатив 1s/foo/bar/.
muru

Чудово !!! <3_ <3
Кампанія

3

Ще кілька варіантів:

  • awk(потрібна відносно нова версія GNU awk)

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Перл / оболонка

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • Оболонки / стригути

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

2

Цей сценарій виконуватиметься так, як ви просили, помістивши змінені файли в новий каталог, фактично не змінюючи оригінали.

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

Я повільно відповідав (перевіряв свій код) ... і мені набагато краще подобається рішення heemayl!
Чарльз Боллінг,

0

Використання gawk

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

Приклад

% 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: Я використовую його для масового пошуку та заміни. Це потужне з можливістю використання RegEx - регулярних виразів. Ви можете працювати з файлами в каталозі, вказувати розширення файлів, наприклад, ".html" тощо. І ви можете подивитися локальну зміну кандидата в контексті, в графічному інтерфейсі. jEdit чудовий.

jEdit доступний через програмний центр Ubuntu.


0

Команди хвоста та кота зробили це легко:

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

Загорніть їх у відповідний цикл і, можливо, використовуйте належний та праведний тимчасовий файл замість жорстко закодованого тимчасового імені файлу. Я вважаю, що bash та інші оболонки мають синтаксис для створення тимчасових файлів.

Варіант -n хвоста має дві інтерпретації залежно від того, чи має аргумент знак плюс. Якщо він має знак плюс, то це означає показати хвіст файлу, починаючи з заданого номера рядка. Інакше число - це кількість рядків, включаючи останній рядок, який повинен виводити хвіст.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.