Когда вывод команды cal
не является терминалом, она применяет подчеркивание бедняги к номеру дня на сегодня, который состоит из вставки символа подчеркивания и символа возврата перед каждым подчеркиваемым символом. Вы можете увидеть это, отобразив символы визуально ( ^ H
означает control-H , который является символом возврата на место):
cal | cat -A
cal | cat -vet
или посмотрев на шестнадцатеричный дамп:
cal | hd
cal | od -t x1
Итак, вам нужно обнаружить подчеркнутые символы и вывести их.
С помощью GNU grep есть простой способ распечатать все совпадения регулярного выражения: использовать параметр -o
. Символ подчеркивания соответствует расширенному регулярному выражению _ ^ H.
где ^ H
- буквальный символ возврата, а не два символа ^
и H
и .
- это символ для печати. Вместо того, чтобы вводить символ обратного пробела, вы можете полагаться на тот факт, что это единственный способ, которым cal использует подчеркивание в своем выводе. Так что достаточно обнаружить символы подчеркивания и оставить пробелы как несоответствующие символы.
cal | grep -o '_..'
Мы близки к этому, но вывод содержит последовательность символов подчеркивания и обратной косой черты, а цифры находятся в отдельных строках. Вы можете убрать все нецифровые символы (и добавить обратно завершающую новую строку):
cal | grep -o '_..' | tr -d 0-9; echo
В качестве альтернативы вы можете повторить шаблон _ ..
, чтобы сопоставить несколько подчеркнутых цифр. Это оставляет подчеркивание в выводе, вы можете использовать tr или sed, чтобы убрать его.
cal | grep -E -o '(_..)*'
cal | grep -E -o '(_..)*' | tr -d '\b_'
cal | grep -E -o '(_..)*' | sed 's/_.//g'
Вы можете сделать это с помощью sed, но это не совсем просто. Sed предлагает простой способ распечатать только совпадающие строки (используйте параметр -n
, чтобы получить только строки, которые печатаются явно), но нет прямого способа распечатать несколько совпадений в строке. Один из способов решить эту проблему - воспользоваться преимуществом того факта, что существует не более двух подчеркнутых символов и имеется одна команда s
для преобразования и вывода строк, содержащих один подчеркнутый символ, и другой для строк с двумя. Как и раньше, я не буду явно сопоставлять пробелы.
cal | sed -n 's/.*_.\(.\)_.\(.\).*/\1\2/p; s/.*_.\(.\).*/\1/p'
Альтернативный подход к sed, предполагающий, что в строке есть только один подчеркнутый сегмент, заключается в удалении всего перед ним и всего после него.
cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/p'
Остались символы подчеркивания; мы можем удалить их с помощью третьей замены.
cal | sed -n 's/^[^_]*_/_/; s/\(_..\)[^_]*$/\1/; s/_.//gp'
Попробуйте
sysctl -w net.ipv4.conf.eth1.route_localnet=1
или
sysctl -w net.ipv4.conf.all.route_localnet=1
Возможно, вам придется дважды проверить, чтобы ядро поддерживает route_localnet
. Замените eth1 соответствующим образом.
Обратите внимание, что этот route_localnet
отключен по соображениям безопасности.