Как заставить различную команду проигнорировать определенные строки второго файла (удар)?

Ваша проблема происходит из-за Вас, переименовал Вашего пользователя (mpatil) корневой каталог к /home/algo. Это вызывает это, некоторые приложения не могут прочитать свои конфигурации, потому что у Вас нет каталога /home/mpatil больше. Проблема будет решена при переименовании каталога /home/algo кому: /home/mpatil. Можно сделать это со следующей командой: mv /home/algo /home/mpatil.

2
02.10.2016, 16:37
4 ответа

Можно поменять местами stdout и stderr stream. см. следующий пример:

ps aux 3>&1 1>&2 2>&3 | grep init

Подробнее см. по этой ссылке .

-121--185972-

Во-первых, есть проблема: вы не упомянули кодировку в вашем вопросе, что заставляет меня полагать, что вы не знаете, как это влияет на это. Кодировка символов определяет значение отдельных байтов. Это означает, что нам нужно начать с небольшого урока истории, и ответ на вопрос, легко это или нет, уже «нет».

Ваш пример технически не ASCII. Расширенные знаки, которые вы обсуждаете сначала, сделали свое появление в кодовой странице 437 IBM (известный различными именами такой как как CP437, OEM 437 и IBM437), но они не были частью чаще всего используемых интернет-кодировок (т.е. ISO 8859-1 иначе латинский 1) до , UTF-8 стал фактическим стандартом. UTF-8 вернул эти символы в виде Block Elements и Box-drawing Characters . Следует отметить, что упомянутые мною блоки Юникода содержат символы, которые изначально не присутствовали в CP437, что делает поддержку шрифта пятнистой.

С таким пониманием мы можем разбить это на два шага:

  1. Определите, с помощью чего следует интерпретировать поток байтов.
  2. Определите, какие комбинации байтов являются «интересными» для вас.

Как уже заявляли другие, невозможно определить, следует ли интерпретировать обычно используемые текстовые символы (то есть в основном что-либо на кодовой странице Latin-1, включая 7-битный набор ASCII) как художественные. Есть диапазоны символов, которые вы можете заинтересовать больше, чем обычно, из-за гораздо более высокой вероятности того, что они используются в искусстве.

Ради здравомыслия каждого, я предполагаю, что мы обсуждаем UTF-8 здесь. Рассекая приведенный пример, мы видим символы из следующих блоков Юникода:

Отсюда все зависит от реализации. Необходимо изучить каждый символ и определить, попадают ли они в интересующий вас блок Юникода. Делать это вручную без опыта может быть сложно, так как UTF-8 является многобайтовой кодировкой: это означает, что отдельные символы вне базового 7-битного набора ASCII представлены более чем одним байтом. Использование программного обеспечения, которое UTF-8 известно, значительно упростит это. Я не рекомендую использовать bash в одиночку, как следует из названия вашего вопроса.

-121--166635-

Обходной путь состоит в том, чтобы снять соответствующие строки и затем разделить их. Это означает, что file1 и file2 будут выглядеть следующим образом:

I need to buy apples.
I need to run the laundry.

I need to get the car detailed.

Это можно сделать с помощью комбинации grep , perl и sed :

$ lines_to_ignore=$(grep -nFf file3 file2 | perl -pe 's|^(\d+):.*|$1s/.//g;|')
$ echo $lines_to_ignore 
3s/.//g;
$ diff <(sed "$lines_to_ignore" file1) <(sed "$lines_to_ignore" file2)        
$ echo $?
0
  • Я использую grep , чтобы получить соответствующие строки (вместе с номерами строк) в file2
  • Затем я использую perl , чтобы получить номера строк из вывода grep и сделать из них команды sed ( Ns/.//g удаляет каждый символ в строке N).
  • Затем подстановка процесса используется для передачи результата sed выполнения этих команд в файлах в diff .
3
27.01.2020, 21:56

Используйте опцию GREP, чтобы отфильтровать линию из файла

$ diff f1 f2
3c3
< I need to wash the dog.
---
> I need to wash the car.
$ diff <( grep -v -f f3 -x f1) <( grep -v -f f3 -x f2)
3d2
< I need to wash the dog.

, где

  • <() - это синтаксис Bash для создания временного файла
  • в GREP
    • -x Сопоставить целую ложь
    • -F F3 Принять Patterm из файла F3
    • -V Показать непревзойденный шаблон
1
27.01.2020, 21:56

Хорошо, так что, возможно, это было пустой тратой времени, так как решение не имеет ничего общего с gnome-gmail или браузером по умолчанию, но я нашел ответ, так что я ставлю его здесь на случай, если кто-то еще сочтет это полезным.

На самом деле это так же просто, как щелкнуть значок «double-diamond» в адресной строке хрома, в gmail и выбрать опцию «Разрешить хром открывать ссылки электронной почты».

http://www.thegooru.com/how-to-open-email-mailto-links-in-gmail/

-121--174884-

Учитывая, что вы использовали awk в вашем вопросе, вот еще одна альтернатива tr и fmt :

awk '{ for ( i = 1; i < NF; ++i ) print $(i); }' test.txt |
while IFS= read -r var 
do 
    echo processing: "$var" 
done

Обратите внимание, что, как и в случае fmt и в отличие от tr , awk

-121--202598-

Здесь можно объединить diff и combine :

$ diff file1.txt <(combine file2.txt NOT file3.txt)
3d2
< I need to wash the dog.

Обновлено для отражения изменений в ОП.

1
27.01.2020, 21:56

diff не может быть правильным инструментом. Похоже, вам нужно использовать COMM , который классифицирует каждую строку в одном файле, другой файл или общий для обоих.

Ключевое ограничение, однако, состоит в том, что Comm требует отсортированного как входных файлов

0
27.01.2020, 21:56

Теги

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