sed на cygwin может заменить только один символ?

Наконец, это работает.
Проблема должна быть связана со специальными символами в пароле.

Теперь у меня есть:

[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>

Итак, пароль без кавычек.

2
21.03.2017, 02:36
2 ответа

Поместите команду sed в файл, например, sed.cmds, и затем вызовите sed как:

sed -i -f "sed.cmds" "MyFile.xml"

Также попробуйте изменить разделитель на _ , например:

s_ true _ false _g

2
27.01.2020, 21:49

Скорее всего, этот файл закодирован в 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
10
27.01.2020, 21:49

Теги

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