Команда не выполняется должным образом на удаленном сервере

Это потому, что [...] совпадает по символу. 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.

.

1
23.08.2015, 18:26
1 ответ

Вам необходимо заключить удаленную команду в кавычки, чтобы выполнить все это на удаленном сервере, иначе вы запустите все после конвейера на локальном хосте. , а это не то, что вам нужно (как описано в комментариях):

foo=`ssh $remoteuser@$remoteaddr "ls -tr1 /mnt/backup1tb/testarossa/test | tail -n +5 | xargs -d '\n' rm -f"`
2
27.01.2020, 23:36

Теги

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