Chcę dołączyć tekst do pliku jak echo "abc" >>file.txt
.
Ale to dodaje abc
po nowej linii
Jak mogę dodać abc
na końcu pliku echo bez nowej linii?
shell
text-processing
io-redirection
echo
choijj
źródło
źródło
abc
bez ostatniego nowego wiersza, który (po uważnym przeczytaniu pytania) nie wydaje się tym, czego chcesz.Odpowiedzi:
echo "abc" >>file.txt
wstawia nowy wiersz poabc
, a nie przed. Jeśli skończysz zabc
własną linią, oznacza to, że nowa linia wcześniejabc
była już wfile.txt
.Zauważ, że całkowicie normalne jest, aby plik tekstowy kończył się nową linią. W systemie uniksowym linia składa się z sekwencji znaków innych niż null⁰ lub nowa linia, po której następuje nowa linia. 1 Dlatego każdy niepusty plik tekstowy kończy się znakiem nowej linii.
Jeśli chcesz dodać tekst do ostatniego wiersza pliku, nie możesz tego zrobić
>>
, ponieważ to zawsze dołącza się do pliku, więc zawsze pisze po ostatniej nowej linii. Zamiast tego potrzebujesz narzędzia, które może modyfikować istniejący plik. Na przykład możesz użyć sed :W poleceniu sed pierwsze
$
oznacza „wykonaj następujące polecenie tylko w ostatnim wierszu”, polecenies/REGEX/REPLACEMENT/
zastępuje REGEX przez WYMIANA, a wyrażenie regularne$
pasuje na końcu wiersza.Polecenie sed systemu Linux ma wbudowaną funkcję automatyzującą tę sekwencję tworzenia-nowego-pliku-i-zamiany, dzięki czemu można ją skrócić
⁰ To bajt zerowy, który ASCII nazywa NUL, a Unicode nazywa U + 0000. Programy przetwarzające tekst mogą, ale nie muszą, radzić sobie z tym znakiem.
1 Patrz definicje pliku tekstowego , wiersza i znaku nowej linii w sekcji „Definicje” rozdziału Definicje podstawowe w IEEE 1003.1-2008: 2016.
źródło
0x41
(ASCII'A'
), to technicznie nie jest to już plik tekstowy? Jeśli tak, sugeruję podkreślenie tego punktu, ponieważ jest to rodzaj nieintuicyjnej definicji; jeśli nie, niewielka zmiana w sformułowaniu może pomóc uniknąć nieporozumień.Nie wydaje mi się, aby było to możliwe za pomocą
echo
polecenia,sed
zamiast tego użyj następującego podejścia:-i
- zmodyfikować plik inplace$
- wskazać ostatni rekord / linięs/$/abc/
- zamień koniec linii na$
podłańcuchabc
(dla ostatniego rekordu)źródło
date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
'$ s/$/$1/'
odcisków$1
Zakładając, że plik nie kończy się na nowej linii i po prostu chcesz dodać trochę tekstu bez dodawania jednego, możesz użyć
-n
argumentu, np.Jednak niektóre systemy UNIX nie zapewniają tej opcji; w takim przypadku możesz użyć
printf
np(początkowym
%s
argumentem jest ochrona przed dodatkowym tekstem zawierającym%
znaki formatujące)Z
man echo
(na macOS High Sierra):źródło
echo -n
nie wstawi nowego wiersza na końcuabc
, aleabc
nadal będzie poprzedzony nowym wierszem, którego użytkownik chce uniknąć.\n
nie pojawił się w pierwszej kolejności. Więcej opcji jest lepszych, szczególnie gdy nie wymagają przepisania całego pliku za każdym razem, gdy nastąpi zmiana (która może być dość wolna i działać w czasie wielomianowym, jeśli jest to powtarzane).Jeśli masz
truncate
polecenie, a plik tekstowy ma NL jako ostatni znak, możesz go usunąć, a następnie dołączyć tekst w następujący sposób:(Zauważ, że
truncate
nic nie obchodzi zawartości pliku, aw tym przykładzie po prostu zmniejsza rozmiar pliku o jeden bajt. Jeśli twój ostatni znak nie jest jednym bajtem, tj. Jest to wielobajtowy „szeroki” znak, wówczas wprowadzisz uszkodzenie).źródło
To, co chcesz, to dodać go na końcu ostatniego wiersza, a więc tuż przed ogranicznikiem tego ostatniego wiersza, a więc tuż przed ostatnim znakiem pliku.
Za pomocą
ksh93
możesz:Gdzie
1<>
standardowy operator otwiera plik w trybie do odczytu i zapisu (a co ważniejsze bez obcięcia ) na standardowym wyjściu i>#((...))
jest operatorem szukającym specyficznym dla ksh93 (tutaj, aby szukać przed ostatnim bajtem). Zauważ, żeecho
zapisujeabc<newline>
tam, gdziea
nadpisuje nową linię, która tam była iecho
dodaje własną nową linię .zsh
Równoważne:Chociaż dla dokładniejszego odpowiednika, będziesz musiał wydrukować komunikat o błędzie, jeśli nie będziesz szukać:
źródło
Prawdopodobnie numer UUOC, ale możesz również wykonać:
Jak podkreśla Gilles, to polecenie jest ograniczone:
Ponadto należy zachować ostrożność podczas korzystania
cat
z plików, których nie znasz:Wniosek :
Użyj sed
źródło
echo
: pcat
, ale z problemami z wysyłaniem dowolnych sekwencji ucieczki do terminala.