В Solaris 11 / etc / default / init
содержит следующий оператор:
# READERS OF THIS FILE: This file is Obsolete. Migrate to reading properties from svc:/system/environment:init.
Таким образом, общесистемные переменные среды могут и должны быть установлены с помощью утилиты SMF и настройки соответствующей службы в соответствующий способ.
Должно ли быть 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
Вы не понимаете вышесказанного?
Группы захвата:help /\(
позволяют сохранять то, что совпадает с шаблоном внутри \(...\)
; затем вы можете ссылаться на совпадение (через \1
для первой группы, \2
и т. д. )в замене (или даже впоследствии в самом шаблоне ).
Один из способов (решения вашей проблемы )состоит в том, чтобы зафиксировать имя файла перед расширением .tar.gz
. В замене ставить захват (\1
), пробел, затем исходный текст (\0
, или&
):
:%substitute/\(.*\)\.tar\.gz$/\1 &/
Кроме того, вы можете просто сопоставить содержимое перед расширением (, заканчивая сопоставление с \ze
), а затем продублировать это:
:%substitute/.*\ze\.tar\.gz$/& &/
\1
, но ничего не захватили. [a-z_-]
не соответствует литералу .
,но это появляется в вашем примере. .
(как\.
); он будет соответствовать любому символу. Если всегда нужно удалять.tar.gz, то:
%s/^\(.*\).tar.gz/\1 \1.tar.gz/g
имя файла :тест
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
На основе принятого в настоящее время ответа , если суффикс строки, возможно, изменится с .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