Заменить шестнадцатеричные символы (\ x20) из строки пробелом ASCII - PullRequest
0 голосов
/ 14 декабря 2018

Я запускаю команду оболочки, которая возвращает необработанную строку, которая является комбинацией символов ASCII и Hex.Символ, который он встраивает, это пробел в шестнадцатеричном формате.Ниже приведен вывод:

KINGSTON\x20SV100S2
ST380011A\x20\x20\x20\x20\x20\x20\x20
Maxtor\x206L300S0\x20\x20

Как заменить все \x20 на один символ пробела ASCII?

Ожидаемый вывод:

KINGSTON SV100S2
ST380011A
Maxtor 6L300S0

PS строкахранится в переменной bash, поэтому я бы предпочел решение, не содержащее входной файл.

Ответы [ 4 ]

0 голосов
/ 17 июля 2019

Вы можете попробовать Perl также

$ perl -e ' BEGIN { print "KINGSTON\x20SV100S2","\n" } '
KINGSTON SV100S2
$

или

Вы можете экспортировать его в среду

$ export a="KINGSTON\x20SV100S2"
$ perl -e ' BEGIN { $x=$ENV{a}; $x=~s/\\x(\d{2})/chr(hex($1))/ge; print $x,"\n" } '
KINGSTON SV100S2
$
0 голосов
/ 14 декабря 2018

Чтобы заменить только \x20 и ничего больше, используйте sed:

sed 's/\\x20/ /g' <<< "$output"

или

yourCommand | sed 's/\\x20/ /g'

Для замены всех escape-последовательностей используйте echo -n (как уже указывал квантурout) или, что еще лучше, более переносимый printf %b, который также можно напрямую назначать переменным без использования $():

printf -v output %b "$output"
0 голосов
/ 14 декабря 2018

printf более портативен, чем echo -e.Вам необходимо использовать %b формат.Согласно help printf:

%b раскрыть escape-последовательности обратной косой черты в соответствующем аргументе

Определить вспомогательную функцию:

expbs() { printf '%b\n' "$@"; }

Тогдаиспользуйте это как:

expbs 'KINGSTON\x20SV100S2'
KINGSTON SV100S2

expbs 'ST380011A\x20\x20\x20\x20\x20\x20\x20'
ST380011A

expbs 'Maxtor\x206L300S0\x20\x20'
Maxtor 6L300S0
0 голосов
/ 14 декабря 2018

Быстрый способ - использовать echo -e

$ echo -e "KINGSTON\x20SV100S2"
KINGSTON SV100S2

-e включить интерпретацию обратной косой черты

или простоиспользуйте printf

$ printf "KINGSTON\x20SV100S2"
KINGSTON SV100S2
...