как использовать sed для замены числа буквами

streamer -o -  | { dd bs=1 count=1 2>/dev/null; pkill screen_saver; cat; } | mpv -

Первый байт из streamerзахватывается ddи проходит дальше }. ddнемедленно завершается, pkillзапускается, затем все остальное проходит через cat. Весь поток должен попасть в mpv.

Это требует, чтобы pkillмолчал в своем стандартном выводе и ничего не читал из streamer. Мой pkillтакой. На всякий случай вы можете убедиться, что:</dev/null pkill screen_saver >/dev/null.


Чтобы проверить идею с помощью обычных инструментов, запустите:

cat | { dd bs=1 count=1 2>/dev/null; echo "triggered" >&2; cat; } | cat

и введите что-нибудь (первое cat, вероятно, получит что-нибудь только после того, как вы нажмете Enter). Вы увидите triggered<newline>, вставленное сразу после первого байта вашего ввода. Обратите внимание, что эта строка не мешает потоку, который получает последний cat, потому что она печатается в stderr; это здесь только для того, чтобы показать, что запуск происходит, когда вам это нужно.

Имейте в виду, что ddработает с байтами, поэтому, если первый введенный вами символ многобайтовый -(, например,. śв UTF -8 ), то вывод может вас удивить (, потому что ваша консоль обрабатывает и чередует stdout и stderr команд ). Это означает только то, что срабатывание произошло в середине -символа, сразу после первого байта , точно так, как задумано.

2
25.09.2020, 23:08
1 ответ
  • Отбросьте скобки, иначе Sed попытается сопоставить скобки в вашем файле.

  • {n}является частью расширенных регулярных выражений. Дайте Sed флаг -E, чтобы включить их (sed -Ef redact.sed redact.txt), или экранируйте каждую фигурную скобку.

  • Обратите внимание, что ваш файл содержит что-то вроде en -тире (0xE28892 ):Это не старый добрый 0x2D ASCII -, так что вам также нужно поместить его в выражение Sed.

    sed 's/[0-9]\{3\}−[0-9]\{2\}−[0-9]\{4\}/xxx-xx-xxxx/g'
    sed -E 's/[0-9]{3}−[0-9]{2}−[0-9]{4}/xxx-xx-xxxx/g'
    
3
18.03.2021, 23:02

Теги

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