Основано на этом ответе на SuperUser:
создать таблицу маршрутизации для некоторых IP-адресов:
ip rule add from / table
Затем объявите новый маршрут, соответствующий таблице маршрутизации
:
ip route add default via dev tun0 table
Было бы проще иметь подсеть для людей, которым нужно использовать VPN, потому что с этой конфигурацией вам нужно указать все IP в таблице
Чтобы разделить строки во входном файле на те, которые заканчиваются точкой, и те, которые не заканчиваются, предполагая, что в каждой строке есть одно предложение, и сохранить их в двух разных выходных файлах, вы можете использовать grep
дважды вот так:
grep '\.$' "$1" >declarative.txt
grep -v '\.$' "$1" >others.txt
Нет необходимости перебирать строки в цикле оболочки (на самом деле, это не рекомендуется). Инструменты Unix, которые обрабатывают текстовые файлы, имеют встроенные -циклы, которые уже делают это, поэтому grep
, например, будет применять регулярное выражение к каждой строке входных данных по очереди и выводить те, которые соответствуют.
Вы также можете обойтись без синтаксического анализа входного файла только один раз, например.awk
:
awk '/\.$/ { print >"declarative.txt"; next }
{ print >"others.txt" }' "$1"
Это запускает блок, который печатает текущую строку в файл declarative.txt
, если строка заканчивается точкой. Другой блок будет срабатывать для всех остальных линий.
... или с помощьюsed
:
sed -n -e '/\.$/w declarative.txt' \
-e '//!w others.txt' "$1"
Текущая строка записывается в declarative.txt
, если она заканчивается точкой, и в others.txt
, если нет. Пустое выражение //
означает «повторно -использовать последнее регулярное выражение», а !
означает «сделать это , если выражение не совпало».
Это не допустимый способ идентификации повествовательных предложений. Во-первых, ни одно из ваших предложений не начинается с заглавной буквы, а многие вообще не являются предложениями. Но если вы просто хотите разделить строки вашего входного файла на два файла, один из которых содержит те строки, которые заканчиваются точкой, а другой содержит остальные, вы можете просто использоватьawk
:
awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' file
Если вам действительно нужно сделать это как сценарий оболочки, вы можете просто использовать:
#!/bin/sh
awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' "$1"
И если это должна быть петля оболочки (, что не очень хорошая идея ), вы можете сделать:
#!/bin/bash
while IFS= read -r line; do
[[ $line =~ \.$ ]] &&
echo "$line" >> fullStop ||
echo "$line" >> others
done < "$1"
Или, если вы не можете использовать специальные функции bash -:
#!/bin/sh
while IFS= read -r line; do
printf '%s\n' "$line" | grep -q '\.$' &&
echo "$line" >> fullStop ||
echo "$line" >> others
done < "$1"