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

18

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

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

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

Спасибо заранее!

    
задан TomTsagk 02.08.2015 в 00:47
источник

7 ответов

20

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

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

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

Также исходные файлы будут скопированы с расширением .bak , если вы не хотите, чтобы это просто использовалось:

sed -i '1s/^.*$/new line/' *.txt
    
ответ дан heemayl 02.08.2015 в 00:57
источник
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 cmd run cmd - команда командного режима после загрузки первого буфера.
  • Nes включает несовместимый, тихий, ex-mode, что лучше для неинтерактивной обработки.

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

  • Текстовое содержимое setline может быть любым - & в тексте замены sed может иметь непреднамеренные эффекты.
ответ дан muru 02.08.2015 в 01:16
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
    
ответ дан terdon 02.08.2015 в 10:18
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
    
ответ дан Charles Boling 02.08.2015 в 01:04
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
    
ответ дан A.B. 02.08.2015 в 11:30
0

jEdit: Я использую его для массового поиска и замены. Это мощное средство, позволяющее использовать RegEx - Regular Expressions. Вы можете работать с файлами в каталоге, указывать расширения файлов, например, «.html» и т. Д. И вы можете посмотреть на язык изменения кандидата в контексте, в графическом интерфейсе. jEdit отлично.

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

    
ответ дан Roger 10.08.2015 в 22:02
0

Команды tail и cat будут делать это легко:

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

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

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

    
ответ дан cardiff space man 03.09.2015 в 19:55