Я хочу удалить первую строку нескольких текстовых файлов и заменить ее другой строкой. Существует ли способ сделать это использование терминала?
Я знаю, как использовать энергию, есть ли способ автоматизировать ее с нею? Я не хочу делать его вручную (как в редактировании каждого файла индивидуально).
Если возможный я хотел бы постараться не устанавливать новые библиотеки (специально для чего-то как этот, который я считаю очень простыми - но я мог быть неправым).
Заранее спасибо!
Можно использовать sed
:
sed -i.bak '1s/^.*$/new line/' *.txt
Это заменит первую строку всего .txt
файлы в текущем каталоге с текстом new line
, изменит его для удовлетворения потребностей.
Также исходные файлы будут сохранены с .bak
расширение, если Вы не захотите, это просто использует:
sed -i '1s/^.*$/new line/' *.txt
Ну, использование 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
, текст замены может иметь непреднамеренные эффекты. Несколько других опций:
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
Этот сценарий сделает, как Вы запросили, поместив измененные файлы в новый каталог, на самом деле не изменяя оригиналы.
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
jEdit: Я использую его для mass-find-and-replace. Это мощно со способностью использовать RegEx - Регулярные выражения. Можно воздействовать на файлы в рамках каталога, указать расширения файла, например, ".html" и т.д. И, можно посмотреть на локаль изменения кандидата в контексте в GUI. jEdit является большим.
jEdit доступен через центр программного обеспечения Ubuntu.
Хвост и команды кошки сделали бы это легко:
tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file
Переносят тех, которые в подходящем цикле и возможно используют надлежащий и справедливый временный файл вместо трудно кодированного временного имени файла. Я верю удару, и другие оболочки имеют синтаксис для создания временных файлов.
-n опция хвоста имеет две интерпретации в зависимости от того, имеет ли аргумент знак "плюс". Если это имеет знак "плюс" затем, это означает показывать хвост файла , запускающегося в данный номер строки. Иначе число является количеством строк, включая последнюю строку, тот хвост, как предполагается, производит.
Используя 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
rpl намного лучше, чем sed
.
Боже мой, наконец-то решение простое:
rpl "myFlag=True" "myFlag=False" *.cfg