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

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

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

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

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

18
задан 1 August 2015 в 15:58

8 ответов

Можно использовать sed:

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

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

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

sed -i '1s/^.*$/new line/' *.txt
21
ответ дан 23 November 2019 в 02:06

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

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

  • setline текстовое содержание может быть чем-либо - & в sed, текст замены может иметь непреднамеренные эффекты.
11
ответ дан 23 November 2019 в 02:06

Несколько других опций:

  • 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
    
3
ответ дан 23 November 2019 в 02:06

Этот сценарий сделает, как Вы запросили, поместив измененные файлы в новый каталог, на самом деле не изменяя оригиналы.

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
2
ответ дан 23 November 2019 в 02:06

jEdit: Я использую его для mass-find-and-replace. Это мощно со способностью использовать RegEx - Регулярные выражения. Можно воздействовать на файлы в рамках каталога, указать расширения файла, например, ".html" и т.д. И, можно посмотреть на локаль изменения кандидата в контексте в GUI. jEdit является большим.

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

0
ответ дан 23 November 2019 в 02:06

Хвост и команды кошки сделали бы это легко:

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

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

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

0
ответ дан 23 November 2019 в 02:06

Используя 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
ответ дан 23 November 2019 в 02:06

rpl намного лучше, чем sed.

Боже мой, наконец-то решение простое:

rpl "myFlag=True" "myFlag=False" *.cfg
0
ответ дан 3 August 2020 в 17:33

Другие вопросы по тегам:

Похожие вопросы: