Что-то подобное произошло со мной.
Поскольку это было куплено за границей, ноутбук, который я использовал, имел аппаратные средства Wi-Fi, которые поддерживали меньше каналов, чем те поддерживаемые AP (который был локален). AP было настроено для автоматического выбора канала в зависимости от других сетей, существующих в области.
Это выбрало канал, который не поддерживался ноутбуком. Я обнаружил это при помощи sudo iwlist eth1 channel
это отобразило меньше значений (1 - 11 только), в то время как AP отображало больше возможностей (1 - 13, веб-интерфейс показывал ту деталь).
Счастливо я мог вынудить AP использовать данный канал, который поддерживался обеими сторонами через его интерфейс конфигурирования, все работало просто великолепно после этого.
Оборотная сторона: теперь, если многие люди используют канал, я выбрал, сетевая производительность, возможно, повлияться.
Вы могли бы использовать GREP -O
, чтобы напечатать только соответствующую часть и использовать результат как шаблоны для второго GREP -V
на оригинальном Paints.txt
Файл:
grep -oFf patterns.txt Strings.xml | grep -vFf - patterns.txt
Хотя в этом конкретном случае вы также можете использовать
+ Сортировка
:
join -t\" -v1 -j2 -o 1.1 1.2 1.3 <(sort -t\" -k2 patterns.txt) <(sort -t\" -k2 strings.xml)
Лучший подход - это, наверное, что предложил @don_crissti, поэтому вот вариация на той же теме:
$ grep -vf <(grep -Po 'name=\K.+?"' Strings.xml) patterns.txt
"ExitWarning"
"SomeMessage"
"Help"
Это в основном - это подход @ don_crissti. Он использует GREP с помощью совместимых Perl регулярных выражений ( -P
) и переключатель ) и
, чтобы распечатать только соответствующую часть линии. Затем Regex ищет имя =
и отбрасывает его ( \ k
), а затем ищет один или несколько символов до первого »
( , +? »
). Это приводит к списку шаблонов, присутствующих в файле string.txt
, который затем передается в качестве ввода на обратный GREP ( GREP -V
) с использованием замены процесса ( <(команда)
).
Я бы, наверное, использовал разрез
. То есть, если, как кажется, вы знаете, где ожидать строку в кавычках, которую вы ищете.
Если я сделаю:
{ cut -sd\" -f2 |
grep -vFf- pat
} <<\IN
# <string name="Introduction">One day there was an apple that went to the market.</string>
# <string name="BananaOpinion">Bananas are great!</string>
# <string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>
IN
... после сохранения моей собственной копии вашего примера patterns.txt
в pat
и выполнения вышеуказанной команды, вывод будет:
"ExitWarning"
"SomeMessage"
"Help"
cut
выводит в стандартный вывод только второй "
двойные кавычки -d
исключенный -f
поле для каждой строки ввода, совпадающей с разделителем, и -s
подавляет все остальные.
То, что cut
на самом деле печатает в grep
, это:
Introduction
BananaOpinion
MessageToUser
grep
ищет в своем именованном файловом операнде строки, которые -v
не соответствует фиксированным строкам -F
в его -
шаблоне stdin -f
файл.
Если вы можете положиться на второе поле "
-delimited в качестве подходящего, тогда это определенно будет оптимизация по сравнению с режимом grep
-P
erl, просто сопоставив -F
фиксированные струны и только крошечные их части, потому что cut
делает тяжелую работу - и делает это быстро .
otra forma es poner patterns.txt y Strings.xml en una lista y encontrar filas únicas
cat patterns.txt Strings.xml | grep -oFf patterns.txt | sort | uniq -u
explicación:
cat patterns.txt Strings.xml
pone todo en una lista. grep -oFf patterns.txt
elimina basura en cada línea. sort
auto -explicativo. ordenar todas las líneas. uniq -u
imprime solo líneas únicas.
for p in $(cat patterns.txt); do if ! grep $p strings.xml &>/dev/null; then echo $p; fi; done
es fácil de entender pero tiene el tiempo de inactividad de generar múltiples procesos grep, uno para cada línea en patterns.txt.