Для чего нужен символ «~» в команде «sed 's ~ ~~ g'»? [дубликат]

Это должно сделать то, о чем вы просите

unzip -: foo.zip

На странице руководства

-: [все, кроме Acorn, VM / CMS, MVS, Tandem] позволяет извлекать архив участников в места за пределами текущего '' извлечения корневая папка ». По соображениям безопасности при распаковке обычно удаляются компоненты пути '' parent dir '' ('' ../ '') из имен извлеченного файла . Эта функция безопасности (новая в версии 5.50) предотвращает случайную запись файлов при распаковке в "конфиденциальные" области за пределами заголовка дерева активной папки извлечения. Параметр -: позволяет unzip вернуться к прежнему, более либеральному поведению, чтобы разрешить точное извлечение (более старых) архивов, в которых использовались компоненты '' ../'' . для создания нескольких деревьев каталогов на уровне текущей папки извлечения. Эта опция не включает явную запись в корневой каталог ('' / ''). Чтобы добиться этого, необходимо установить для целевой папки извлечения значение root (например, -d /). Однако, когда указан параметр -:, все еще возможно неявная запись в корневой каталог, указав достаточное количество компонентов пути '' ../ '' в zip {{1} } архив. Используйте эту опцию с особой осторожностью.

30
11.05.2018, 16:04
2 ответа

Es un delimitador alternativo para el comando sedsustituto (s). Por lo general, se usa la barra inclinada, como en s/pattern/replacement/, pero sedpermite usar casi cualquier carácter.

La razón principal para usar otro delimitador que no sea /en la expresión de sustitución sedes cuando la expresión actuará sobre caracteres literales /.

Por ejemplo, para sustituir la ruta /some/path/herepor /other/path/now, se puede hacer

s/\/some\/path\/here/\/other\/path\/now/

Esto sufre de lo que generalmente se conoce como "síndrome del palillo inclinado" , lo que significa que es difícil de leer y mantener adecuadamente.

En cambio,se nos permite usar otro delimitador de expresión:

s#/some/path/here#/other/path/now#

Usar ~es solo otro ejemplo de un delimitador de expresión de sustitución válido.

Tu expresión

s~ ~~g

es lo mismo que

s/ //g

y eliminará todos los espacios de la entrada. En este caso, no es necesario usar otro delimitador que no sea /ya que ni el patrón ni el reemplazo contienen /.

Otra forma de hacer lo mismo es

tr -d ' ' <infile >outfile
54
27.01.2020, 19:38

Es un delimitador de sustitución. El delimitador más utilizado es una barra diagonal /. Pero sedpuede usar cualquier carácter como delimitador -, automáticamente usará el carácter que sigue a scomo delimitador:

sed 's@ @@g'
sed 's+ ++g'
sed 's\ \\g'
sed 's* **g'

También es posible usar el espacio como delimitador:

echo "foo" | sed 's foo bar g'

Otros delimitadores que no sean /se usan con mayor frecuencia cuando tiene muchas barras en su comando en la sintaxis que se vuelve confusa. Considere este caso en el que queremos convertir varios espacios en un solo carácter de espacio :en lugar de

echo "    a   b  c  " | sed 's/\s\{1,\}/ /g'

puedes ejecutar

echo "    a   b  c  " | sed 's~\s\{1,\}~ ~g'

que es más claro.

18
27.01.2020, 19:38

Теги

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