Как переместить линию из файла в другой файл на основе сопоставления шаблонов?

Похоже, что если Alt_R не назначен никакому другому модификатору, по умолчанию используется Mod1Mask.

Простого отключения правого alt в моем Xmodmap было недостаточно, чтобы заставить его перестать сообщать о состоянии 0x8, мне пришлось привязать его к другому модификатору (я выбрал Mod3, поскольку он все равно был пуст), а затем xev начал сообщать о состоянии 0x20 .

Хотя это скорее обходной путь, чем решение.

1
10.09.2018, 18:54
3 ответа

Если у вас достаточно свежая версия GNU awk (gawk), вы можете

awk -i inplace -F'/' '$7 == "_f" {print > "otherfile"; next} 1' file

Если ваш awk не поддерживает параметр -i inplace, вы можете сделать то же самое, но перенаправить вывод во временный файл, а затем переименовать его.

0
28.01.2020, 00:29

Как насчет этого предложения? Это менее краткое предложение, чем ответ @steeldriver , тем не менее, это прогрессивное решение (шаг за шагом ).

$ cut -d/ -f7 data.txt  | grep -n _f | cut -d: -f 1 | xargs -i sed -n {}p data.txt > otherfile.txt
  • _f— шаблон, созданный при сопоставлении с другим файлом.

  • data.txtваш файл

  • /ваш разделитель

Если это сработало, выполните comm, чтобы выяснить, что должно остаться в исходном файле.

$ comm -23 data.txt otherfile.txt > remainder.txt

rest.txt — это ваш data.txt с удаленными битами.

0
28.01.2020, 00:29

Оригинальный выпуск

Регулярное выражение не может быть указано с опцией -Fотносительно grep. Есть еще одна проблема, связанная с регулярным выражением. Если символ ^используется в качестве привязки к началу строки, он должен быть первым символом регулярного выражения.

prompt% cp -v input input.back
prompt% grep -e "$regex" input.back > output
prompt% grep -v "$regex" input.back > input

Регулярное выражение:Оригинальный постер не предоставил конкретных входных данных, поэтому трудно найти подходящее регулярное выражение.

Редактировать :, наконец, исходный постер предоставил образец входного файла.

Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
Apple/One-plus/Samsung/Mi/HTC/OPPO/

Регулярное выражение:regex

regex='\([-[:alpha:]]\+\/\)\{5\}_Nokia\/'

Альтернативные решения

Подобные решения не рекомендуются новичкам, которые никогда не читали руководство по sed.

sed -n "/$regex/p;/$regex/d;w input" input.back > output

Грубо говоря,строки, соответствующие регулярному выражению, сохраняются в файле output, затем удаляются из соответствующего sed-буфера, а содержимое буфера записывается в файл input.

sed -i.back -e "/$regex/w output" -e "/$regex/d" input

Эти команды имеют небольшие различия, но вторая более удобна.

0
28.01.2020, 00:29

Теги

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