Con bostezo para gensub
gawk '{sub(/[^.]*/,gensub(/([^.]*).*/,"\\1",1,$2)+2,$2)}1' infile
Ваш код:
echo "<?php $x=$_GET['x']; echo $x;?>" > x.php
Поскольку строка, которую вы передаете в echo
, заключена в двойные кавычки, оболочка попытается раскрыть в ней любые переменные оболочки. Строка содержит две такие переменные,$x
(дважды )и $_GET
. Если эти переменные не имеют присвоенного значения, они будут заменены пустыми строками.
Предполагая, что вы хотите напечатать строку в файле как есть, сделайте это вместо этого:
echo '<?php $x=$_GET['"'"'x'"'"']; echo $x;?>' >x.php
Здесь я заключил строку в одинарные кавычки. Это предотвращает попытку оболочки расширить то, что выглядит в ней как переменные оболочки.
Поскольку строка с одинарными кавычками не может содержать одинарные кавычки, их нужно добавлять особым образом. Я решил добавить их как"'"
(двойные одинарные кавычки )путем конкатенации с остальной частью строки.
В качестве альтернативы экранируйте каждый $
в строке:
echo "<?php \$x=\$_GET['x']; echo \$x;?>" >x.php
Третий способ — использовать цитируемый здесь -документ :
.cat <<'PHP_END' >x.php
<?php $x=$_GET['x']; echo $x;?>
PHP_END
Таким образом, вам не нужно изменять реальную строку, чтобы оболочка обрабатывала ее правильно, и вам также не нужно помнить, что реализация некоторых оболочек echo
может выполнять дополнительные действия с C -управляющие последовательности стилей и т. д. (если вы хотите вставить их в свой код PHP ).