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

То же самое случилось со мной. Я не знаю, почему это произошло, но «lxappearance» (пришлось установить его с помощью apt-get install lxappearance), запущенный с терминала, исправил его для меня.

1
задан 2 August 2015 в 01:58

6 ответов

Ну, используя 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 включает несовместимый, бесшумный, ex-mode, что лучше для неинтерактивной обработки.

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

setline (n, text), ну, это функция, которая устанавливает строку n в text.
11
ответ дан 23 May 2018 в 18:34
  • 1
    sed кажется намного проще в использовании, но действительно потрясающе, что vim может сделать то же самое! Большое спасибо за ваш ответ! – TomTsagk 2 August 2015 в 02:23
  • 2
    @TomTsagk хорошо, я просто хотел проиллюстрировать, как вы можете воздействовать на несколько файлов (bufdo). У вас есть файлы, которые уже открыты и ... И чтобы показать альтернативу 1s/foo/bar/. – muru 2 August 2015 в 03:33
  • 3
    Awesoming !!! & Л; 3_ & л; 3 – Campa 5 August 2015 в 09:50

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

awk (требуется относительно новая версия GNU awk)
$ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
Perl / shell
$ 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 May 2018 в 18:34

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

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 May 2018 в 18:34
  • 1
    Я медленно отвечал (проверял мой код) ... и мне нравится решение heemayl намного лучше! – Charles Boling 2 August 2015 в 02:07

Использование 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 May 2018 в 18:34

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

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

0
ответ дан 23 May 2018 в 18:34

Команды хвоста и кошки сделают это легко:

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

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

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

0
ответ дан 23 May 2018 в 18:34

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

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