Как использовать имена файлов в команде sed?

Чтобы отключить автоматический вход в систему Ubuntu, вы можете выполнить следующие шаги и на шаге 5. Переключить автоматический входной переключатель в положение OFF.

Автозапуск Ubuntu описан здесь: [!d2 ] Авторизация автоматически. Вы можете изменить свои настройки, чтобы вы автоматически вошли в свою учетную запись при запуске компьютера: откройте Обзор действий и начните вводить пользователей. Нажмите «Пользователи», чтобы открыть панель. Выберите учетную запись пользователя, для которой вы хотите автоматически войти в систему при запуске. Нажмите «Разблокировать» и введите свой пароль. Переключите переключатель автоматического входа в положение ON. При следующем запуске вашего компьютера вы будете авторизованы автоматически. Если этот параметр включен, вам не нужно вводить пароль для входа в свою учетную запись, а это означает, что если кто-то еще запускает ваш компьютер, он сможет получить доступ к вашей учетной записи и вашим личным данным, включая ваши файлы и браузер история.

Дополнительная информация, предоставленная OP @Craig Hicks:

Фактический файл, который был изменен, - /etc/lightdm.conf. Добавлена ​​строка: autologin-user=<username>.
6
задан 5 March 2018 в 00:33

12 ответов

Вы можете сделать:

for f in *.conf; do
    base=$(basename "$f" '.conf') # gives '25' from '25.conf'
    sed -i.before "s/example/$base/g" "$f"
done

При использовании переключателя -i в sed вы должны быть абсолютно уверены, что ваша команда sed работает, потому что -i изменяет файлы, место. Это означает, что сгенерированный вывод будет перезаписывать входной файл. Если ваша команда замены (s/…/…/) неверна, вы можете получить пустые файлы и резервные копии. Следовательно, я использовал -i.before, который оставит файл *.before с исходным контентом.

7
ответ дан 22 May 2018 в 12:46
  • 1
    Да, это 100% по теме @foolsparadise. PerlDuck, пожалуйста, ознакомьтесь с областью сайта, прежде чем предлагать иное. – terdon♦ 5 March 2018 в 01:10

Вы можете сделать:

for f in *.conf; do base=$(basename "$f" '.conf') # gives '25' from '25.conf' sed -i.before "s/example/$base/g" "$f" done

При использовании переключателя -i в sed вы должны быть абсолютно уверены, что ваша команда sed работает, потому что -i изменяет файлы, место. Это означает, что сгенерированный вывод будет перезаписывать входной файл. Если ваша команда замены (s/…/…/) неверна, вы можете получить пустые файлы и резервные копии. Следовательно, я использовал -i.before, который оставит файл *.before с исходным контентом.

7
ответ дан 17 July 2018 в 19:33

Вы можете сделать:

for f in *.conf; do base=$(basename "$f" '.conf') # gives '25' from '25.conf' sed -i.before "s/example/$base/g" "$f" done

При использовании переключателя -i в sed вы должны быть абсолютно уверены, что ваша команда sed работает, потому что -i изменяет файлы, место. Это означает, что сгенерированный вывод будет перезаписывать входной файл. Если ваша команда замены (s/…/…/) неверна, вы можете получить пустые файлы и резервные копии. Следовательно, я использовал -i.before, который оставит файл *.before с исходным контентом.

7
ответ дан 23 July 2018 в 20:17

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

#! /bin/bash
for f in *.conf ; do
    b=${f%.conf}
    sed -i "s/example/$b/" "$f"
done
5
ответ дан 22 May 2018 в 12:46

Вы можете выполнить задачу без цикла, используя GNU parallel:

parallel sed -i.old s/example/{.}/ {} ::: *.conf

Это особенно полезно, если у вас есть много файлов для редактирования, так как parallel запускает одно задание на каждый процессор Ядро

-i.old означает: отредактируйте файл i n-place и сделайте резервную копию, добавив расширение .old к исходному имени файла (удалите .old, если вы не хотите, чтобы резервная копия , но помните, что у вас нет резервной копии, тогда) s/example/{.}/g означает s ubstitute example с входным именем файла без его расширения ({.}) и сделать это g lobally (= для каждого появления) заменяется на входное имя файла :::, отделяет команду для запуска от аргументов для передачи к ней *.conf соответствует каждому .conf файлу в текущем каталоге
2
ответ дан 22 May 2018 в 12:46
  • 1
    @OleTange Вы, вероятно, правы, я не совсем уверен в правильной терминологии и просто описал эту функцию, как в man parallel. Спасибо! – dessert 6 March 2018 в 02:12
  • 2
    Элегантное решение. Первоначально я беспокоился, будет ли он сломаться, если имена файлов содержат пробел, но вы тоже получили это. – Ole Tange 6 March 2018 в 12:37
  • 3
    @OleTange I? Нет, parallel закрыл это! Это просто замечательная часть программного обеспечения, если вы спросите меня, полезную в качестве замены почти для каждого цикла for и xargs. – dessert 6 March 2018 в 12:40
  • 4
    @OleTange О, подождите, я просто понял, что вы, возможно, уже это знали. : D Большое спасибо за то, что вы сделали так легко, --will-cite! – dessert 6 March 2018 в 14:22

С awk, который имеет переменную FILENAME, автоматически устанавливается на имя файла (и, если GNU awk, с изменениями на месте):

$ for i in {20..26}; do printf "%s\n" "datafname = example.nex" "ofprefix = best.example" > $i.conf; done
$ gawk -i inplace 'FNR == 1 {split(FILENAME, file, ".")} {gsub("example", file[1])} 1' *.conf
$ cat 25.conf
datafname = 25.nex
ofprefix = best.25
FNR == 1 {split(FILENAME, file, ".")}: на первой строки каждого файла, разделите имя файла на . и сохраните его в массиве file {gsub("example", file[1])} 1: для всех строк замените example на первый элемент массива file и распечатайте.
1
ответ дан 22 May 2018 в 12:46

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

#! /bin/bash for f in *.conf ; do b=${f%.conf} sed -i "s/example/$b/" "$f" done
5
ответ дан 17 July 2018 в 19:33

Вы можете выполнить задачу без цикла, используя GNU parallel:

parallel sed -i.old s/example/{.}/ {} ::: *.conf

Это особенно полезно, если у вас есть много файлов для редактирования, так как parallel запускает одно задание на каждый процессор Ядро

-i.old означает: отредактируйте файл i n-place и сделайте резервную копию, добавив расширение .old к исходному имени файла (удалите .old, если вы не хотите, чтобы резервная копия , но помните, что у вас нет резервной копии, тогда) s/example/{.}/g означает s ubstitute example с входным именем файла без его расширения ({.}) и сделать это g lobally (= для каждого появления) {} заменяется на входное имя файла :::, отделяет команду для запуска от аргументов для передачи к ней *.conf соответствует каждому .conf файлу в текущем каталоге
2
ответ дан 17 July 2018 в 19:33

С awk, который имеет переменную FILENAME, автоматически устанавливается на имя файла (и, если GNU awk, с изменениями на месте):

$ for i in {20..26}; do printf "%s\n" "datafname = example.nex" "ofprefix = best.example" > $i.conf; done $ gawk -i inplace 'FNR == 1 {split(FILENAME, file, ".")} {gsub("example", file[1])} 1' *.conf $ cat 25.conf datafname = 25.nex ofprefix = best.25 FNR == 1 {split(FILENAME, file, ".")}: на первой строки каждого файла, разделите имя файла на . и сохраните его в массиве file {gsub("example", file[1])} 1: для всех строк замените example на первый элемент массива file и распечатайте.
1
ответ дан 17 July 2018 в 19:33

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

#! /bin/bash for f in *.conf ; do b=${f%.conf} sed -i "s/example/$b/" "$f" done
5
ответ дан 23 July 2018 в 20:17

Вы можете выполнить задачу без цикла, используя GNU parallel:

parallel sed -i.old s/example/{.}/ {} ::: *.conf

Это особенно полезно, если у вас есть много файлов для редактирования, так как parallel запускает одно задание на каждый процессор Ядро

-i.old означает: отредактируйте файл i n-place и сделайте резервную копию, добавив расширение .old к исходному имени файла (удалите .old, если вы не хотите, чтобы резервная копия , но помните, что у вас нет резервной копии, тогда) s/example/{.}/g означает s ubstitute example с входным именем файла без его расширения ({.}) и сделать это g lobally (= для каждого появления) {} заменяется на входное имя файла :::, отделяет команду для запуска от аргументов для передачи к ней *.conf соответствует каждому .conf файлу в текущем каталоге
2
ответ дан 23 July 2018 в 20:17
  • 1
    @OleTange Вы, вероятно, правы, я не совсем уверен в правильной терминологии и просто описал эту функцию, как в man parallel. Спасибо! – dessert 6 March 2018 в 02:12
  • 2
    Элегантное решение. Первоначально я беспокоился, будет ли он сломаться, если имена файлов содержат пробел, но вы тоже получили это. – Ole Tange 6 March 2018 в 12:37
  • 3
    @OleTange I? Нет, parallel закрыл это! Это просто замечательная часть программного обеспечения, если вы спросите меня, полезную в качестве замены почти для каждого цикла for и xargs. – dessert 6 March 2018 в 12:40
  • 4
    @OleTange О, подождите, я просто понял, что вы, возможно, уже это знали. : D Большое спасибо за то, что вы сделали так легко, --will-cite! – dessert 6 March 2018 в 14:22

С awk, который имеет переменную FILENAME, автоматически устанавливается на имя файла (и, если GNU awk, с изменениями на месте):

$ for i in {20..26}; do printf "%s\n" "datafname = example.nex" "ofprefix = best.example" > $i.conf; done $ gawk -i inplace 'FNR == 1 {split(FILENAME, file, ".")} {gsub("example", file[1])} 1' *.conf $ cat 25.conf datafname = 25.nex ofprefix = best.25 FNR == 1 {split(FILENAME, file, ".")}: на первой строки каждого файла, разделите имя файла на . и сохраните его в массиве file {gsub("example", file[1])} 1: для всех строк замените example на первый элемент массива file и распечатайте.
1
ответ дан 23 July 2018 в 20:17

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

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