Как включить в регулярное выражение те строки, которые начинаются с буквы «N», но исключить те, которые начинаются с «N/A»

/usr/share/X11/xkb/rules/evdevсодержит спецификацию правил . Правила сообщают XKB, как создавать раскладки из частей, они не определяют конкретную раскладку. Ввод xkbcompдолжен быть раскладкой .

Самый простой способ выяснить, каким должен быть ввод, — это прочитать справочную страницу(ха-ха нет )читать официальную документацию(как будто )прочитать вводящее в заблуждение руководство Unreliable guide (, которое настолько хорошо, что на него есть ссылка на полу -официальную вики X.org , но хотя оно содержит информацию на самом деле не указано, что это ввод дляxkbcomp)эээ, спросить в интернете? О, ты только что сделал это.

Что ж, xkbcompработает в обе стороны. Поэтому, если вы просто попросите его декомпилировать раскладку клавиатуры с вашего дисплея, вы увидите приемлемый ввод.

xkbcomp :0 - | less

Синтаксис::

xkb_keymap {
  xkb_keycodes { … };
  xkb_types    { … };
  xkb_compat   { … };
  xkb_symbols  { … };
  xkb_geometry { … };
}

Содержимое фигурных скобок после xkb_xxx— это то, что входит в файлы в каталогах /usr/share/X11/xkb/xxx. Вы можете использовать оператор include, чтобы указать xkbcompчитать существующие файлы. Обратите внимание, что вам нужна одна директива includeс +между именами файлов. Некоторые файлы содержат несколько директив xkb_xxx, передайте имя нужной в скобках. Например, чтобы использовать раскладку США с Composeв меню ,использовать

xkb_symbols { include "us+compose(menu)" }

Вы можете попроситьsetxkbmapпредоставить приемлемый ввод для xkbcomp. Передайте параметр -print, чтобы увидеть вывод, а не передавать раскладку на сервер. С помощью setxkbmapпередайте -compat, -geometry, -keycodesи -types, чтобы установить соответствующие xkb_xxxи -layoutдля xkb_symbols.

setxkbmap -layout "us+compose(menu)" -print

На самом деле, я соврал по умолчанию выше, есть более простой способ :информация находится на Arch wiki . Если вам нравится понимать, как настроить вашу систему, Arch wiki — отличный ресурс, независимо от того, используете вы Arch Linux или нет.

0
17.05.2020, 23:04
3 ответа

Вот почему в awk существует режим абзаца. Это будет работать с использованием любого awk в любой оболочке на каждом компьютере UNIX :

.
$ awk -v RS= -F'\n' -v OFS='\t' '{$1=$1}1' file
Table   $0.10   100     1       10
Chair   $0.12   N/A     7       5
Desktop $0.08   86      7       3
Door    $0.00   N/A     7       3
Nails   $0.10   N/A     7       5
Sofa    $0.07   100     7       3
Stool   $1.00   0       7       5
Natural wood    $0.00   99      7       20
Carpet  $0.10   100     7       3

Все вышеперечисленное является идиоматическим awk, вот что это значит:

  1. RS=<null>сообщает awk, что ваш ввод представляет собой набор записей, разделенных пустыми строками (, то есть абзацами ).
  2. -F'\n'сообщает awk, что поля ввода разделены новой строкой (, что эквивалентно-v FS='\n').
  3. OFS='\t'сообщает awk, что поля вывода должны быть разделены табуляцией -.
  4. $1=$1указывает awk перекомпилировать текущую запись, заменяя каждую FS (новую строку )на OFS (вкладку )между полями.
  5. 1является истинным условием, которое вызывает действие awks по умолчанию для печати текущей записи.
4
28.04.2021, 23:13

Можно сделать с NR (количество записей ), но необходимо удалить пустые строки.

   sed '/^$/d' filename | awk '{ORS=(NR%5?FS:RS)}1'
0
28.04.2021, 23:13

Я нашел решение благодаря рекомендации steeldriver:

sed -E ':a;N;/\n[A-Za-z][^/]/!s/\n/\t/;ta;P;D'
Table   $0.10   100 1   10       
Chair   $0.12   N/A 7   5       
Desktop $0.08   86  7   3       
Door    $0.00   N/A 7   3    
Nails   $0.10   N/A 7   5    
Sofa    $0.07   100 7   3    
Stool   $1.00   0   7   5    
Natural wood    $0.00   99  7   20  
Carpet  $0.10   100 7   3
0
28.04.2021, 23:13

Теги

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