Làm cách nào để thêm một chuỗi sau mỗi dòng trong tệp bằng cách sử dụng bash? Nó có thể được thực hiện bằng cách sử dụng lệnh sed, nếu vậy làm thế nào?
Làm cách nào để thêm một chuỗi sau mỗi dòng trong tệp bằng cách sử dụng bash? Nó có thể được thực hiện bằng cách sử dụng lệnh sed, nếu vậy làm thế nào?
Câu trả lời:
Nếu bạn sed
cho phép chỉnh sửa tại chỗ thông qua -i
tham số:
sed -e 's/$/string after each line/' -i filename
Nếu không, bạn phải tạo một tệp tạm thời:
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
$ có nghĩa là cuối dòng. ^ có nghĩa là đầu dòng.
sed 's/^/string after each line/'
thì có những gì tôi mong đợi (thêm vào từng dòng) nhưng sed 's/^/string after each line/'
không (nó thay thế toàn bộ dòng bằng chuỗi phụ của tôi). Đưa cái gì? Có ý kiến gì không @TomDeGisi?
Tôi thích sử dụng hơn awk
. Nếu chỉ có một cột, hãy sử dụng $0
, nếu không hãy thay thế nó bằng cột cuối cùng.
Một chiều,
awk '{print $0, "string to append after each line"}' file > new_file
hoặc cái này,
awk '$0=$0"string to append after each line"' file > new_file
NR
biến:awk '{print $0, NR}'
sed 's/ //g'
điều này phù hợp với yêu cầu của tôi, nhưng nó sẽ loại bỏ khoảng trống trong mọi dòng, đó là tùy chọn g
cho và ở mọi nơi trong một dòng.
,
thích {print $0"string to append after each line"}
.
Nếu bạn có nó, tiện ích lam (laminate) có thể làm điều đó, ví dụ:
$ lam filename -s "string after each line"
Vỏ POSIX tinh khiết và sponge
:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
và printf
:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
Sử dụng join
:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
Công cụ Shell sử dụng paste
, yes
, head
& wc
:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Lưu ý rằng paste
chèn một ký tự Tab trước đó $suffix
.
Tất nhiên sponge
có thể được thay thế bằng tệp tạm thời, sau đó thay thế mv
tên tệp gốc, như với một số câu trả lời khác ...
sed
, trừ khi nguồn lực rất hạn chế.
sed
không cần thiết cho một công việc đơn giản như vậy.
Tôi thích hơn echo
. sử dụng bash tinh khiết:
cat file | while read line; do echo ${line}$string; done
Sed hơi xấu, bạn có thể làm điều đó một cách thanh lịch như vậy:
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
; làm echo $ {i} bar; đã thực hiện foobar barbar barbar bazbar nhưng sau một số bài kiểm tra, tôi có thể sai về lập luận của mình, nhưng Dennis đã đúng
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
in 2 dòng mặc dù đầu vào là 1 dòng foo bar
(và cat
việc đọc từ stdin thay vì tệp không tạo ra sự khác biệt cho điều này).
touch
lại là tập tin tạm thời? Và tôi sẽ làm chosed
lệnh có điều kiện về sự thành công củacp
hoặc bản gốc có thể bị mất.