разделение повествовательных предложений из входного файла в другой файл

Основано на этом ответе на SuperUser:

создать таблицу маршрутизации для некоторых IP-адресов:

ip rule add from / table 

Затем объявите новый маршрут, соответствующий таблице маршрутизации:

ip route add default via  dev tun0 table  

Было бы проще иметь подсеть для людей, которым нужно использовать VPN, потому что с этой конфигурацией вам нужно указать все IP в таблице

3
11.06.2020, 17:16
2 ответа

Чтобы разделить строки во входном файле на те, которые заканчиваются точкой, и те, которые не заканчиваются, предполагая, что в каждой строке есть одно предложение, и сохранить их в двух разных выходных файлах, вы можете использовать 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, если нет. Пустое выражение //означает «повторно -использовать последнее регулярное выражение», а !означает «сделать это , если выражение не совпало».

4
19.03.2021, 02:29

Это не допустимый способ идентификации повествовательных предложений. Во-первых, ни одно из ваших предложений не начинается с заглавной буквы, а многие вообще не являются предложениями. Но если вы просто хотите разделить строки вашего входного файла на два файла, один из которых содержит те строки, которые заканчиваются точкой, а другой содержит остальные, вы можете просто использовать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"
4
19.03.2021, 02:29

Теги

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