Направление с проблемой с Regex В Команде Sed

Используйте одинарные кавычки:

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

(Не то, чтобы я понимаю, почему Вы хотите создать сценарий или почему название сценария должно быть двумя буквами.)

2
26.01.2019, 18:06
3 ответа

Ваш sed шаблон \.[^.]*$ имеет только одно соответствие к исходной строке: .log.

Подробнее:

  • \. соответствуйте только точечному символу.
  • [^.] соответствия любой символ, отличающийся от .
  • [^.]* соответствия любая последовательность символов, отличающихся от .
  • $ соответствует концу строки.

Так здесь финал .log единственное соответствие (.stuvwy.log не соответствие, потому что оно содержит внутреннюю точку). sed заменит этим пустой строкой согласно просьбе командой s/\.[^.]*$//. Поэтому Вы заканчиваете с:

abcdef.ghijkl.mnopqr.stuvwy
4
27.01.2020, 21:51
  • 1
    я думал как'.' соответствия любой символ кроме новой строки, таким образом [^]. означал бы соответствовать только новой строке. Если это не так затем я соглашаюсь с Вашим объяснением. –  nvarun 03.08.2011, 22:36
  • 2
    @nvarun: \. точка соответствий, и . соответствия что-либо. Что касается новых строк, они обрабатываются специальным способом. Шаблон подобран отдельно против каждой строки, таким образом, необычно использовать \n в командах sed. –  Stéphane Gimenez 03.08.2011, 22:44

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

${VAR%.*} удалит соответствие шаблона шарика .* от конца строки в $VAR. Помните, что это - шарик и не regex, таким образом, a . означает литерал ".".

$ foo=aaa.bbbb.2011.log
$ echo ${foo%.*}
aaa.bbbb.2011

Посмотрите Расширение параметра Shell в странице справочника Bash для получения дополнительной информации.

3
27.01.2020, 21:51

s/\.[^.]*$// == Замените первой частью строки (потому что существует нет g опция в конце для соответствия всем случаям), который запускается с точки (\.), сопровождаемый нулем или больше (*) символы, которые не являются точками ([^.]), помещенный в конце строки ($), с пустой строкой (//).

2
27.01.2020, 21:51

Теги

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