Используйте одинарные кавычки:
echo -e '#!/usr/bin/python\nimport string as s,random;print "".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg
Правила для !
был вид привитых на другие правила заключения в кавычки впоследствии (от csh). Они были очень полезной спиной, когда оболочки не имели редактирования командной строки, но некоторые люди все еще используют их теперь.
P.S. Так как Вы кодируете для удара:
echo $'#!/usr/bin/python\nimport string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg
Это работает над большинством нельдов:
echo python -c \''import string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'\'>pg;chmod +x pg;./pg
(Не то, чтобы я понимаю, почему Вы хотите создать сценарий или почему название сценария должно быть двумя буквами.)
Ваш sed шаблон \.[^.]*$
имеет только одно соответствие к исходной строке: .log
.
Подробнее:
\.
соответствуйте только точечному символу.[^.]
соответствия любой символ, отличающийся от .
[^.]*
соответствия любая последовательность символов, отличающихся от .
$
соответствует концу строки.Так здесь финал .log
единственное соответствие (.stuvwy.log
не соответствие, потому что оно содержит внутреннюю точку). sed
заменит этим пустой строкой согласно просьбе командой s/\.[^.]*$//
. Поэтому Вы заканчиваете с:
abcdef.ghijkl.mnopqr.stuvwy
Если Вы не хотите использовать sed
можно использовать встроенную замену шаблона оболочки. Это на самом деле быстрее, не имея необходимость назвать внешнюю программу.
${VAR%.*}
удалит соответствие шаблона шарика .*
от конца строки в $VAR
. Помните, что это - шарик и не regex, таким образом, a .
означает литерал ".".
$ foo=aaa.bbbb.2011.log
$ echo ${foo%.*}
aaa.bbbb.2011
Посмотрите Расширение параметра Shell в странице справочника Bash для получения дополнительной информации.
s/\.[^.]*$//
== Замените первой частью строки (потому что существует нет g
опция в конце для соответствия всем случаям), который запускается с точки (\.
), сопровождаемый нулем или больше (*
) символы, которые не являются точками ([^.]
), помещенный в конце строки ($
), с пустой строкой (//
).
\.
точка соответствий, и.
соответствия что-либо. Что касается новых строк, они обрабатываются специальным способом. Шаблон подобран отдельно против каждой строки, таким образом, необычно использовать\n
в командах sed. – Stéphane Gimenez 03.08.2011, 22:44