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?
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?
Odpowiedzi:
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
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), ale sed '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,
awk '{print $0, "string to append after each line"}' file > new_file
albo to,
awk '$0=$0"string to append after each line"' file > new_file
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 opcja g
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:
$ lam filename -s "string after each line"
Czysta powłoka POSIX i sponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
i printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
Używając join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
Narzędzia Shell za pomocą paste
, yes
, head
i wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Zauważ, że paste
wstawia znak Tab przed $suffix
.
Oczywiście sponge
można go zastąpić plikiem tymczasowym, a następnie mv
nad oryginalną nazwą pliku, tak jak w przypadku niektórych innych odpowiedzi ...
sed
, chyba że zasoby są bardzo ograniczone.
sed
nie jest potrzebny do tak prostej pracy.
Wolę echo
. używając czystego basha:
cat file | while read line; do echo ${line}$string; done
Sed jest trochę brzydki, możesz to zrobić elegancko w ten sposób:
hendry@i7 tmp$ cat foo
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar
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 wiersz foo bar
(a cat
odczyt ze standardowego wejścia zamiast z pliku nie ma w tym żadnego znaczenia).
touch
plik tymczasowy? I uzależniłbym tosed
polecenie od sukcesucp
albo oryginał mógłby zostać utracony.