Замена в редакторе VI

В Solaris 11 / etc / default / init содержит следующий оператор:

# READERS OF THIS FILE: This file is Obsolete.  Migrate to reading properties from svc:/system/environment:init.

Таким образом, общесистемные переменные среды могут и должны быть установлены с помощью утилиты SMF и настройки соответствующей службы в соответствующий способ.

0
21.09.2018, 22:00
5 ответов

Должно ли быть vi?

Если нет, это может сделать то, что вы хотите (с использованием GNUxargs).

cat foo.txt | xargs -i basename {}.tar.gz | xargs -i echo {} {}.tar.gz

, где foo.txt— ваш файл.

Обновление.

$ cat foo.txt
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz


$ cat foo.txt | xargs -i basename {}.tar.gz | xargs -i echo {} {}.tar.gz
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

Вы не понимаете вышесказанного?

-2
28.01.2020, 02:23

Группы захвата:help /\(позволяют сохранять то, что совпадает с шаблоном внутри \(...\); затем вы можете ссылаться на совпадение (через \1для первой группы, \2и т. д. )в замене (или даже впоследствии в самом шаблоне ).

Один из способов (решения вашей проблемы )состоит в том, чтобы зафиксировать имя файла перед расширением .tar.gz. В замене ставить захват (\1), пробел, затем исходный текст (\0, или&):

:%substitute/\(.*\)\.tar\.gz$/\1 &/

Кроме того, вы можете просто сопоставить содержимое перед расширением (, заканчивая сопоставление с \ze), а затем продублировать это:

:%substitute/.*\ze\.tar\.gz$/& &/

Проблемы с вашей попыткой

  • Вы использовали обратную ссылку \1, но ничего не захватили.
  • [a-z_-]не соответствует литералу .,но это появляется в вашем примере.
  • Нет выхода из финала.(как\.); он будет соответствовать любому символу.
  • Отсутствие дублирования в сменной части; вы фактически удалили текст вместо добавления.
5
28.01.2020, 02:23

Если всегда нужно удалять.tar.gz, то:

%s/^\(.*\).tar.gz/\1 \1.tar.gz/g
0
28.01.2020, 02:23

имя файла :тест

abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz

команда

sed "s/[a-z]\{3\}\.\{0,1\}-\{0,2\}\.\{0,1\}[0-9]\{0,1\}\.\{0,1\}[0-9]\{0,1\}/& &/" test| sed "/[a-z]\{3\}\. /s/\.//1"

выход

abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
0
28.01.2020, 02:23

На основе принятого в настоящее время ответа , если суффикс строки, возможно, изменится с .tar.gzна какой-либо другой .xxx.yyy-, подобный строке, следующее будет принимать любые две строки xxxиyyy:

$ sed 's/\(.*\)\(\..*\)\{2\}$/\1 &/' foo.txt
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

Это, очевидно, также может использоваться в viкак :%s/\(.*\)\(\..*\)\{2\}$/\1 &/.

Или, используя расширенные регулярные выражения с sed, который понимает-E:

$ sed -E 's/(.*)(\..*){2}$/\1 &/' foo.txt
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

Здесь {2}указывает соответствие суффикса ровно двух подстрок, разделенных точками -.


$ rev foo.txt | cut -d. -f 3- | rev | paste - foo.txt
abc     abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

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

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

Окончательный вывод разделен табуляцией -, но вы можете сделать его разделенным пробелом -, как в вопросе, заменив последний шаг pasteна paste -d ' ' - foo.txt.


Аналогично предыдущему, но с использованием утилиты basenameдля обрезки .tar.gzсуффиксов имен файлов:

$ xargs -I {} basename {}.tar.gz <foo.txt | paste - foo.txt
abc     abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz
0
20.12.2020, 21:57

Теги

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