Замена определенных команд скобками / скобками при сохранении содержимого (CLI)

Я вижу два (похожих) решения для вашей проблемы:

SSH Chroot jail Когда пользователь входит в систему с ssh, он будет автоматически зацикливаться в каталоге, который вы настроили, и не сможет выйти из него (jail) SFTP Я использовал mysecureshell несколько раз, когда это необходимо для обеспечения доступа к каталогу webroot. MySecureShell - это в основном обертка вокруг chroot, поэтому более или менее она будет делать то же самое.
1
задан 5 February 2018 в 16:41

3 ответа

Вот путь:

sed 's/\\prc{\([^}]*\)}/\1 %/g'

Это приведет к захвату всего внутри скобок после \prc и сохранит его в группе 1, вы можете использовать это, чтобы заменить команду содержимым кронштейны. [^}]* просто берет все, кроме закрывающей скобки. g означает «глобально» и означает, что он заменит все вхождения шаблона в строке, а не только на первый, - вы захотите этого для каждого выражения в вашем случае.

Что касается другой, просто используйте несколько групп:

sed 's/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g'

Вы можете комбинировать столько выражений, сколько хотите, но это становится легко неясным. Я рекомендую записать скрипт sed с одним выражением на строку следующим образом:

#!/bin/sed -f
s/\\prc{\([^}]*\)}/\1 %/g
s/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g

Сохраните его, например. script.sed, сделайте его исполняемым с помощью chmod +x /path/to/script.sed и запустите его с помощью /path/to/script.sed.

Пример run

$ /path/to/script.sed <hello.txt
This is my \textbf{text} where there are about 5 % commands, i.e. 30 ± 20 m.

Я позволяю оболочке открывать входные файлы как можно чаще, поэтому <hello.txt вместо просто hello.txt (что также работает!). Если вам интересно, что это именно так, я рекомендую этот ответ на unix.SE.

1
ответ дан 22 May 2018 в 13:17
  • 1
    Спасибо, это отлично работает! Я искал часть [^}]*. Это неудобно найти хорошую документацию на sed. – bamphe 5 February 2018 в 17:55
  • 2
    О, только что увидел, что ты забыл избежать \prc & amp; \mErrRange в части скрипта (но не мог отредактировать его, так как это не gt; 6 char.) И спасибо за дополнительное объяснение, почему использовать <hello.txt здесь :) – bamphe 5 February 2018 в 18:03
  • 3
    @bamphe Ты совершенно прав, я исправил это - спасибо! Что касается регулярных выражений, мне очень нравится regular-expressions.info , sed использует POSIX BRE , и вы искали это POSIX Bracket Expressions , Чтобы попробовать, я часто использую regexr.com . – dessert 5 February 2018 в 18:15
  • 4
    Ницца! Это действительно полезные сайты, спасибо еще раз :) – bamphe 5 February 2018 в 18:26

Вот путь:

sed 's/\\prc{\([^}]*\)}/\1 %/g'

Это приведет к захвату всего внутри скобок после \prc и сохранит его в группе 1, вы можете использовать это, чтобы заменить команду содержимым кронштейны. [^}]* просто берет все, кроме закрывающей скобки. g означает «глобально» и означает, что он заменит все вхождения шаблона в строке, а не только на первый, - вы захотите этого для каждого выражения в вашем случае.

Что касается другой, просто используйте несколько групп:

sed 's/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g'

Вы можете комбинировать столько выражений, сколько хотите, но это становится легко неясным. Я рекомендую записать скрипт sed с одним выражением на строку следующим образом:

#!/bin/sed -f s/\\prc{\([^}]*\)}/\1 %/g s/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g

Сохраните его, например. script.sed, сделайте его исполняемым с помощью chmod +x /path/to/script.sed и запустите его с помощью /path/to/script.sed.

Пример run

$ /path/to/script.sed <hello.txt This is my \textbf{text} where there are about 5 % commands, i.e. 30 ± 20 m.

Я позволяю оболочке открывать входные файлы как можно чаще, поэтому <hello.txt вместо просто hello.txt (что также работает!). Если вам интересно, что это именно так, я рекомендую этот ответ на unix.SE.

1
ответ дан 17 July 2018 в 21:30

Вот путь:

sed 's/\\prc{\([^}]*\)}/\1 %/g'

Это приведет к захвату всего внутри скобок после \prc и сохранит его в группе 1, вы можете использовать это, чтобы заменить команду содержимым кронштейны. [^}]* просто берет все, кроме закрывающей скобки. g означает «глобально» и означает, что он заменит все вхождения шаблона в строке, а не только на первый, - вы захотите этого для каждого выражения в вашем случае.

Что касается другой, просто используйте несколько групп:

sed 's/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g'

Вы можете комбинировать столько выражений, сколько хотите, но это становится легко неясным. Я рекомендую записать скрипт sed с одним выражением на строку следующим образом:

#!/bin/sed -f s/\\prc{\([^}]*\)}/\1 %/g s/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g

Сохраните его, например. script.sed, сделайте его исполняемым с помощью chmod +x /path/to/script.sed и запустите его с помощью /path/to/script.sed.

Пример run

$ /path/to/script.sed <hello.txt This is my \textbf{text} where there are about 5 % commands, i.e. 30 ± 20 m.

Я позволяю оболочке открывать входные файлы как можно чаще, поэтому <hello.txt вместо просто hello.txt (что также работает!). Если вам интересно, что это именно так, я рекомендую этот ответ на unix.SE.

1
ответ дан 23 July 2018 в 22:09

Другие вопросы по тегам:

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