Как скопировать значение между круглыми скобками в другую часть той же строки

Примечание. :Wi-Fi A и B должны находиться в разных подсетях, иначе система Linux будет жаловаться.

Я предполагаю, что eth0 для ПК,затем вы можете использовать это правило для достижения желаемого для портов ssh и tcp:

iptables -t filter -A FORWARD -i eth0 -o <Interface> -d <Des subnet> -p tcp --dport <Des Port> -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

Чтобы разрешить пинг, вы можете использовать:

iptables -t filter -A FORWARD -i eth0 -o <Interface> -d <Des subnet> -p icmp --icmp-type 8 -j ACCEPT
0
18.06.2019, 18:06
4 ответа

При условии, что ваш CSV не имеет встроенных разделителей (поля, разделенные запятыми, которые содержат запятые в кавычках ), тогда это просто с Awk:

$ awk 'BEGIN{OFS=FS=","} match($5,/^\([0-9]+\)/) {$3 = substr($5,RSTART+1,RLENGTH-2)} 1' file.csv
1003,CC,L1008,,(LB1) Urbà de Barberà del Vallès,3,,,
1006,CK,L0520,,Móra d'Ebre - Móra la Nova (estació),3,,,
1007,AV,L0358,,Granollers-Terrassa-Manresa,3,,,
1011,DD,781,,(781) St. Vicenç Castellet-Castellgalí-Manresa,3,,,
1012,DD,784,,(784) Manresa-Castellgalí-St.Vicenç-Monistrol,3,,,
1013,DD,783,,(783) Manresa-Pt.Vilomara-St.Vicenç-Monistrol,3,,,

Использование Sed (с тем же ограничением):

$ sed -E 's/^([^,]*),([^,]*),([^,]*),([^,]*),\(([0-9]+)\)/\1,\2,\5,\4,(\5)/' file.csv
1003,CC,L1008,,(LB1) Urbà de Barberà del Vallès,3,,,
1006,CK,L0520,,Móra d'Ebre - Móra la Nova (estació),3,,,
1007,AV,L0358,,Granollers-Terrassa-Manresa,3,,,
1011,DD,781,,(781) St. Vicenç Castellet-Castellgalí-Manresa,3,,,
1012,DD,784,,(784) Manresa-Castellgalí-St.Vicenç-Monistrol,3,,,
1013,DD,783,,(783) Manresa-Pt.Vilomara-St.Vicenç-Monistrol,3,,,

Более надежный вариант с использованием Perl Text ::Модуль CSV:

$ perl -C -MText::CSV -lne '
    BEGIN{$p = Text::CSV->new()} 
    @f = $p->fields() if $p->parse($_); 
    $f[2] = $1 if $f[4] =~ /^\((\d+)\)/; 
    print join ",", @f
  ' file.csv
1003,CC,L1008,,(LB1) Urbà de Barberà del Vallès,3,,,
1006,CK,L0520,,Móra d'Ebre - Móra la Nova (estació),3,,,
1007,AV,L0358,,Granollers-Terrassa-Manresa,3,,,
1011,DD,781,,(781) St. Vicenç Castellet-Castellgalí-Manresa,3,,,
1012,DD,784,,(784) Manresa-Castellgalí-St.Vicenç-Monistrol,3,,,
1013,DD,783,,(783) Manresa-Pt.Vilomara-St.Vicenç-Monistrol,3,,,
2
28.01.2020, 02:22

Версии awkи sed, которые steeldriver предоставили, прекрасно работают, и их очень легко реализовать в моей текущей среде.

Я немного улучшил их, чтобы в коде также можно было использовать буквы, пробелы и точки между скобками:

awk 'BEGIN{OFS=FS=","} match($5,/^\([a-zA-Z0-9.]+\)/) {$3 = substr($5,RSTART+1,RLENGTH-2)} 1' file.csv

sed -E 's/^([^,]*),([^,]*),([^,]*),([^,]*),\(([a-zA-Z0-9.]+)\)/\1,\2,\5,\4,(\5)/' file.csv

Другие версии также работают, но не так хорошо подходят для моего рабочего процесса.

Спасибо!

0
28.01.2020, 02:22

Почему не в Python? (замените имя файла на ваше имя файла)

import re, csv
for line in list(csv.reader(open('filename', 'r'))):
    matches = re.findall('\([0-9]*\)',line[4])
    if matches:
        line[2] = matches[0]
    print(','.join(line))
1
28.01.2020, 02:22

Выполнено приведенным ниже скриптом

count=`awk '{print NR}' filename| sort -nr| sed -n '1p'`

for ((i=1;i<=$count;i++)); do h=`awk -v i="$count" -F ","  'NR==i && $5 ~ /^\(/{print $5}' filename | awk '{print $1}'| sed -e  "s/(//g" -e "s/)//g"| wc -l`; if [[ $h != 0 ]]; then k=`awk -v i="$count" -F ","  'NR==i && $5 ~ /^\(/{print $5}' filename | awk '{print $1}'| sed -e  "s/(//g" -e "s/)//g"`; awk -v i="$count" -v k="$k" -F "," 'NR==i && $5 ~ /^\(/{$3=k;print $0}' filename| sed "s/ /,/g"; else awk -v i="$count" 'NR==i {print $0}' filename; fi; done

выход

1003,CC,LB1,,(LB1),Urbà,de,Barberà,del,Vallès,3,,,
1006,CK,L0520,,Móra d'Ebre - Móra la Nova (estació),3,,,
1007,AV,L0358,,Granollers-Terrassa-Manresa,3,,,
1011,DD,781,,(781),St.,Vicenç,Castellet-Castellgalí-Manresa,3,,,
1012,DD,784,,(784),Manresa-Castellgalí-St.Vicenç-Monistrol,3,,,
1013,DD,783,,(783),Manresa-Pt.Vilomara-St.Vicenç-Monistrol,3,,,
0
28.01.2020, 02:22

Теги

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