Заменить непечатаемые символы в perl и sed

Вход оболочки всегда является путем к исполняемому файлу; или абсолютный или относительный. Это должно состоять из пути к каталогу/имени файла. Если Вы только укажете имя исполняемого файла в своем текущем каталоге, то оболочка автоматически снабдит префиксом ту строку, которую Вы вводите с каждым из каталогов в $PATH. Именно поэтому всегда необходимо вводить путь.

BTW, если Ваш код находится в /home/uname/code/ и Вы находитесь в /home/uname/, необходимо не обязательно использовать

./code/a.out
можно также просто использовать
code/a.out
потому что это - также относительный путь.
8
14.07.2017, 19:59
2 ответа

Это типичная работа для tr :

LC_ALL=C tr '\0-\10\13\14\16-\37' '[ *]' < in > out

В вашем случае она не работает с sed , потому что вы находитесь в регионе, где эти диапазоны не соответствуют смысл. Если вы хотите работать со значениями байтов, а не с символами, и где порядок основан на числовом значении этих байтов, лучше всего использовать локаль C . Ваш код работал бы с LC_ALL = C с GNU sed , но использование sed (не говоря уже о perl ) здесь немного излишне (и те \ xXX не переносимы между реализациями sed , в то время как этот подход tr является POSIX).

Вы также можете доверять представлению вашего региона о том, с какими печатными символами относятся:

tr -c '[:print:]\t\r\n' '[ *]'

Но с GNU tr (как обычно в системах на базе Linux) это работает только в языковых стандартах, где символы являются однобайтовыми (обычно это не UTF-8).

В языковом стандарте C это также исключает DEL (0x7f) и все вышеперечисленные байтовые значения (не в ASCII).

В локали UTF-8 вы можете использовать GNU sed , в котором нет проблемы GNU tr имеет:

sed 's/[^[:print:]\r\t]/ /g' < in > out

(обратите внимание, что те \ r , \ t не являются стандартными, и GNU sed не распознает их, если POSIXLY_CORRECT находится в среде (будет рассматривать их как обратную косую черту, r и t входит в набор, как того требует POSIX)).

Он не будет преобразовывать байты, которые не образуют допустимые символы, если таковые имеются.

10
27.01.2020, 20:11

Я пытался отправить уведомление через libnotify с содержимым, которое может содержать непечатаемые символы. Существующие решения не совсем работали для меня (с использованием белого списка символов с использованием trработает, но удаляет любые многобайтовые -символы ).

Вот что сработало при прохождении теста:

message=$(iconv --from-code=UTF-8 -c <<< "$message")
1
27.01.2020, 20:11

Теги

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