Jak dodać ciąg po każdej linii w pliku za pomocą bash? Czy można to zrobić za pomocą polecenia sed, a jeśli tak, to w jaki sposób?
112
Jeśli sed
zezwala się na edycję w miejscu za pomocą -i
parametru:
sed -e 's/$/string after each line/' -i filename
Jeśli nie, musisz utworzyć plik tymczasowy:
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename
touch
plik tymczasowy? I uzależniłbym tosed
polecenie od sukcesucp
albo oryginał mógłby zostać utracony.sed -e 's/^/string after each line/' -i filename
$ oznacza koniec linii. ^ oznacza początek wiersza.sed 's/^/string after each line/'
robi to, czego się spodziewałem (dołącza do każdej linii), alesed 's/^/string after each line/'
nie (zastępuje całą linię moim ciągiem dołączania). Co daje? Jakieś pomysły @TomDeGisi?Wolę używać
awk
. Jeśli jest tylko jedna kolumna, użyj$0
, w przeciwnym razie zastąp ją ostatnią kolumną.Jednokierunkowa,
albo to,
źródło
NR
zmiennej:awk '{print $0, NR}'
sed 's/ //g'
to działało zgodnie z moim wymaganiem, ale usunie spację w każdej linii, to jest opcjag
dla i wszędzie w linii.,
jak{print $0"string to append after each line"}
.Jeśli go masz, narzędzie lam (laminat) może to zrobić, na przykład:
źródło
Czysta powłoka POSIX i
sponge
:xargs
iprintf
:Używając
join
:Narzędzia Shell za pomocą
paste
,yes
,head
iwc
:Zauważ, że
paste
wstawia znak Tab przed$suffix
.Oczywiście
sponge
można go zastąpić plikiem tymczasowym, a następniemv
nad oryginalną nazwą pliku, tak jak w przypadku niektórych innych odpowiedzi ...źródło
sed
, chyba że zasoby są bardzo ograniczone.sed
nie jest potrzebny do tak prostej pracy.Wolę
echo
. używając czystego basha:źródło
Sed jest trochę brzydki, możesz to zrobić elegancko w ten sposób:
źródło
cat foo
; do echo $ {i} bar; zrobione foobar barbar bazbar ale po kilku testach mogę się mylić co do mojego rozumowania, ale Dennis ma racjęecho "foo bar" | (for i in `cat`; do echo ${i}bar; done)
drukowania 2 wierszy, mimo że wejście to 1 wierszfoo bar
(acat
odczyt ze standardowego wejścia zamiast z pliku nie ma w tym żadnego znaczenia).