Наконец, это работает.
Проблема должна быть связана со специальными символами в пароле.
Теперь у меня есть:
[Unit]
Description=Mount docs
[Mount]
What=//192.168.1.5/docs/
Where=/mnt/win7_docs/
Type=cifs
Options=user,credentials=/root/.credentials,iocharset=utf8
[Install]
WantedBy = multi-user.target
/root/.credentials
username=<user>
password=<password>
Итак, пароль без кавычек.
Поместите команду sed
в файл, например, sed.cmds, и затем вызовите sed
как:
sed -i -f "sed.cmds" "MyFile.xml"
Также попробуйте изменить разделитель на _
, например:
s_
Скорее всего, этот файл закодирован в UTF-16, то есть с 2 или 4 байтами на символ, возможно даже с меткой порядка байтов на начало.
Символы, показанные в вашем примере (все символы ASCII), обычно кодируются 2 байтами, первый или второй из которых (в зависимости от того, является ли это кодировка с прямым или обратным порядком байтов UTF-16) равны 0 и другой - код ASCII / Unicode. 0-байт обычно невидим на терминале, поэтому текст выглядит нормально при сбросе туда, так как остальное - это просто ASCII, но на самом деле текст содержит:
<[NUL]S[NUL]t[NUL]a[NUL]r[NUL]t[NUL]W[NUL]h[NUL]e[NUL]n[NUL]...
Вам нужно преобразовать этот текст в кодировку вашей локали для sed
, чтобы иметь возможность справиться с этим. Обратите внимание, что UTF-16 не может использоваться в качестве кодировки символов в языковом стандарте Unix. Вы не найдете языкового стандарта, который использует UTF-16 в качестве кодировки символов.
iconv -f utf-16 < Task_01.xml |
sed 's~<StartWhenAvailable>true</StartWhenAvailable>~<StartWhenAvailable>false</StartWhenAvailable>~g' |
iconv -t utf-16 > Task_01.xml.out
Предполагается, что на входе есть спецификация. Если нет, вам нужно определить, является ли он прямым или прямым порядком байтов (возможно, прямым порядком байтов), и изменить этот utf-16
на utf-16le
или utf-16be
].
Если кодировка языкового стандарта - UTF-8, при переводе ничего не должно быть потеряно, даже если текст содержит символы, отличные от ASCII.
Поскольку Cygwin sed
обычно является GNU sed
, он также сможет обрабатывать этот тип двоичного (поскольку он содержит байты NUL) самостоятельно, поэтому вы также можете сделайте что-нибудь вроде:
LC_ALL=C sed -i 's/t\x00r\x00u\x00e/f\x00a\x00l\x00s\x00e/g' Task_01.xml
Команда file
должна быть в состоянии сказать вам, действительно ли введен UTF-16. Вы можете использовать sed -n l
или od -tc
, чтобы увидеть эти скрытые символы NUL. Пример текста UTF-16 с прямым порядком байтов и спецификацией:
$ echo true | iconv -t utf-16 | od -tc
0000000 377 376 t \0 r \0 u \0 e \0 \n \0
0000014
$ echo true | iconv -t utf-16 | sed -n l
\377\376t\000r\000u\000e\000$
\000$
$ echo true | iconv -t utf-16 | file -
/dev/stdin: Little-endian UTF-16 Unicode text, with no line terminators
Для обработки нескольких файлов с помощью zsh
/ bash
/ ksh93
:
set -o pipefail
for file in ./*.xml; do
cp -ai "$file" "$file.bak" &&
iconv -f utf-16 < "$file.bak" |
sed 's~<StartWhenAvailable>true</StartWhenAvailable>~<StartWhenAvailable>false</StartWhenAvailable>~g' |
iconv -t utf-16 > "$file" &&
rm -f "$file.bak"
done