Это потому, что [...]
совпадает по символу. sed
пытались бы сопоставить символы с диапазоном, указанным в [...]
. В локалях UTF-8 можно встретить только \x8f
как часть многобайтового символа. Вы заметите, что .
на нем тоже не совпадает (и это требование POSIX).
Например:
sed 's/[eé\xa9]//'
не имеет смысла. é
- символ (закодированный как 0xa9
), 0xa9 - не символ, а байт, может быть найден внутри символа (как é
), e
- символ (закодированный как 0x65). Вы не можете ожидать, что sed
каким-то образом сможет соответствовать 0xa9 как внутри символа, так и в виде байта.
Чтобы сопоставить произвольные данные байта с утилитой text, такой как sed
, вы захотите использовать локаль, где символы - это байты, это типичный случай для LC_ALL=C
.
LC_ALL=C sed 's/12[\x8f\x9f]//g'
Или portably:
LC_ALL=C sed "$(printf 's/12[\217\237]//g')"
Обратите внимание, что вы не можете ожидать обработки данных, содержащих символы NUL (или которые не заканчиваются символом новой строки, или где символы новой строки больше, чем несколько килобайт appart) portably с помощью sed
. Вместо этого используйте perl -p/-n
.
.
Вам необходимо заключить удаленную команду в кавычки, чтобы выполнить все это на удаленном сервере, иначе вы запустите все после конвейера на локальном хосте. , а это не то, что вам нужно (как описано в комментариях):
foo=`ssh $remoteuser@$remoteaddr "ls -tr1 /mnt/backup1tb/testarossa/test | tail -n +5 | xargs -d '\n' rm -f"`