Korzystam z następujących 2 sed
poleceń. Pierwszy dodaje znaki nowego wiersza tam, gdzie chcę, drugi także znaki nowego wiersza tam, gdzie chcę, ALE dodaje także dodatkowy znak na końcu pliku, w którym wcześniej go nie było.
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
Użycie od -c
wszystkich 3 plików daje następujące wyniki.
statement_tmp_1.xml (brak \n
na końcu pliku)
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 (brak \n
na końcu pliku)
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
na końcu pliku - skąd on pochodzi?)
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
Korzystam z systemu AIX 5.3
Zasadniczo chcę albo przestać dodawać dodatkowe \n
, albo znaleźć sposób na ich usunięcie.
s|...|&\n|
równie dobrze mógłbyś użyć ?\n
po prawej stronie nie jest przenośny.perl
lub innego narzędzia, które może przetwarzać dane binarne.\<LF>
to tradycyjny i POSIXOWY sposób dodawania znaku LF.\n
zwykle zastępujen
znak w czymkolwiek innym niż GNUsed
.Odpowiedzi:
Powinieneś uważać się za szczęściarza, że AIX
sed
dodał brakujące znaki nowej linii.Niepusty plik, który nie kończy się znakiem nowej linii, nie jest plikiem tekstowym (przynajmniej zgodnie z definicją pliku tekstowego POSIX), ponieważ plik tekstowy ma zawierać linie, a linie są (niezbyt długi) ciąg znaków zakończony znakiem nowego wiersza, więc zachowanie narzędzi tekstowych takich jak
sed
na nim jest nieokreślone i w praktyce różni się od implementacji do implementacji.Niektóre
sed
implementacje odrzuciłyby ten fałszywy charakter po ostatniej linii.AFAIK,
xml
pliki mają być plikami tekstowymi, więc oznaczased
to , że właśnie to naprawiłeś.Jeśli potrzebujesz, aby ten plik nie kończył się znakiem nowej linii, możesz użyć
perl
innych narzędzi, które poradzą sobie z danymi nietekstowymi.źródło
sed
wyjście do dowolnego innego standardowego narzędzia uniksowego. Szczerze mówiąc, nie zauważyłemsed
tego przez lata , ponieważ podstawienia poleceń powłoki Bourne'a, takie jak$(sed 's/bas/replac/' <<<'basement')
ukradkowe przycinanie ostatniej linii, jeśli taka istnieje. Ale są chwile, kiedy zdecydowanie tego nie chcesz; np. manipulowanie tekstem schowka X za pomocąsed
. FYI, GNU sed, jeśli jest dostępny, nie dodaje kończącego znaku nowej linii, jeśli użyjeszp
go z-n
opcją, jak opisano w tej odpowiedzi SE .Oto sposób na usunięcie ostatniej nowej linii z pliku przy użyciu
dd
:Aby sprawdzić, czy plik kończy się znakiem nowej linii, możesz użyć:
Aby uzyskać rozmiar pliku w bajtach, użyj:
źródło
Według tego podręcznika systemu AIX IBM
tail
robi-r
everse - co wygląda całkiem fajnie. Tak długo, jak plik nie przekracza 20 KB, powinny działać:źródło