Я запускаю следующие 2 sed
команды. Первый добавляет символы новой строки, где я хочу их, второй также добавляет символы новой строки, где я хочу их, НО также добавляет дополнительный в конце файла, где раньше его не было.
sed -e 's|\<LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_1.xml > ${XMLDIR}/statement_tmp_2.xml
sed -e 's|\</LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_2.xml > ${XMLDIR}/statement_tmp_3.xml
Использование od -c
всех трех файлов дает следующий результат.
Statement_tmp_1.xml (нет \n
в конце файла)
1314700 T A T E M E N T > < / L I S T _
1314720 G _ S T A T E M E N T > < / G _
1314740 S E T U P > < / L I S T _ G _ S
1314760 E T U P > < / A R X S G P O >
1314777
Statement_tmp_2.xml (нет \n
в конце файла)
1314700 S T A T E M E N T > < / L I S T
1314720 _ G _ S T A T E M E N T > < / G
1314740 _ S E T U P > < / L I S T _ G _
1314760 S E T U P > < / A R X S G P O >
1315000
Statement_tmp_3.xml ( \n
в конце файла - откуда он взялся?)
1314700 S T A T E M E N T > < / L I S T
1314720 _ G _ S T A T E M E N T > \n < /
1314740 G _ S E T U P > < / L I S T _ G
1314760 _ S E T U P > < / A R X S G P O
1315000 > \n
1315002
Я использую AIX 5.3
По сути, я либо хочу, чтобы он прекратил добавлять дополнительные \n
, либо нашел способ их удаления.
s|...|&\n|
так же хорошо?\n
с правой стороны не является портативным.perl
или другой инструмент, который может иметь дело с двоичными данными.\<LF>
это традиционный и POSIX способ добавить символ LF.\n
обычно заменяетn
символ во всем, кроме GNUsed
.Ответы:
Вы должны считать себя счастливчиком, когда AIX
sed
добавил недостающие символы новой строки.Непустой файл, который не заканчивается символом новой строки, не является текстовым файлом (по крайней мере, согласно определению текстового файла в POSIX), поскольку текстовый файл должен содержать строки, а строки (не слишком long) последовательность символов оканчивается символом перевода строки, поэтому поведение текстовых утилит, подобных
sed
описанным, не определено и на практике варьируется от реализации к реализации.В некоторых
sed
реализациях эти ложные символы были бы удалены после последней строки.AFAIK,
xml
файлы предназначены для того, чтобы быть текстовыми файлами, так что это означает, что этоsed
просто исправлено для вас.Если вам нужно, чтобы этот файл не заканчивался символом новой строки, вы можете использовать
perl
другие инструменты, которые могут справиться с нетекстовыми данными.источник
sed
выхода в любую другую стандартную утилиту Unix. Честно говоря, я не замечал, чтоsed
делал это годами , поскольку подстановки команд оболочки Bourne, такие как$(sed 's/bas/replac/' <<<'basement')
скрытое сокращение последней строки, если она есть. Но бывают моменты, когда вы определенно не хотите этого; например , манипулируя текстом X буфера обмена сsed
. К вашему сведению, GNU sed, если доступно, не добавляет завершающий символ новой строки, если вы используетеp
его с-n
опцией, как описано в этом ответе SE .Вот способ удалить последнюю строку из файла, используя
dd
:Чтобы проверить, заканчивается ли файл новой строкой, вы можете использовать:
И чтобы получить размер файла в байтах, используйте:
источник
В соответствии с этим руководством AIX IBM
tail
делает-r
Everse - что выглядит довольно круто. Пока ваш файл меньше 20 КБ, должно работать следующее:источник