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 sedzezwala się na edycję w miejscu za pomocą -iparametru:
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
NRzmiennej: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 gdla 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 filexargsi printf:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge fileUżywając join:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge fileNarzędzia Shell za pomocą paste, yes, head
i wc:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Zauważ, że pastewstawia znak Tab przed $suffix.
Oczywiście spongemożna go zastąpić plikiem tymczasowym, a następnie mvnad oryginalną nazwą pliku, tak jak w przypadku niektórych innych odpowiedzi ...
sed, chyba że zasoby są bardzo ograniczone.
sednie 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 catodczyt ze standardowego wejścia zamiast z pliku nie ma w tym żadnego znaczenia).
touchplik tymczasowy? I uzależniłbym tosedpolecenie od sukcesucpalbo oryginał mógłby zostać utracony.