Как редактировать несколько текстовых файлов с помощью одной команды?


18

Я хочу удалить первую строку из нескольких текстовых файлов и заменить ее другой строкой. Есть ли способ сделать это с помощью терминала?

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

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

Заранее спасибо!

Ответы:


21

Вы можете использовать sed:

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

Это заменит первую строку всех .txtфайлов в текущем каталоге текстом new line, изменив его в соответствии с вашими потребностями.

Кроме того, исходные файлы будут сохранены с .bakрасширением, если вы не хотите, просто используйте:

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

Спасибо! sedэто на самом деле то, что я искал!
ТомЦагк

@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командой using |.
  • -c cmdВыполнение cmd- это команда в командном режиме после загрузки первого буфера.
  • Nes включает несовместимый, бесшумный экс-режим, что лучше для неинтерактивной обработки.

Преимущества:

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

sedкажется намного проще в использовании, но это действительно здорово, что vimможно сделать то же самое! Большое спасибо за ваш ответ!
ТомЦагк

@ TomTsagk хорошо, я просто хотел показать, как вы можете работать с несколькими файлами ( bufdo). Считайте, что у вас есть файлы, уже открытые и ... И показать альтернативу 1s/foo/bar/.
Муру

Awesoming !!! <3_ <3
Кампа

3

Несколько других вариантов:

  • awk(нужна относительно новая версия GNU awk)

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Perl / оболочки

    $ 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

Этот скрипт будет делать, как вы просили, помещая измененные файлы в новый каталог без фактического изменения оригиналов.

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 и cat сделают это легко:

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

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

Опция -n хвоста имеет две интерпретации в зависимости от того, имеет ли аргумент знак плюс. Если у него есть знак плюс, это означает, что хвост файла должен начинаться с заданного номера строки. В противном случае число - это число строк, включая последнюю строку, которую должен вывести хвост.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.