Câu trả lời:
Bạn có thể sử dụng sed
:
sed -i 's/^/your_string /' your_file
Nhờ ý kiến của Stephane và Marco, lưu ý rằng -i
tùy chọn không phải là POSIX. Một cách POSIX để làm những điều trên sẽ là
sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file
hoặc perl
:
perl -pi -e 's/^/your_string /' your_file
Giải trình
Cả hai lệnh thực hiện thay thế regex, thay thế bắt đầu của một dòng ( ^
) bằng chuỗi mong muốn của bạn. Công -i
tắc trong cả hai lệnh đảm bảo tệp được chỉnh sửa tại chỗ (nghĩa là các thay đổi được phản ánh trong tệp thay vì được in ra thiết bị xuất chuẩn).
sed
phải có sẵn trên bất kỳ HĐH tuân thủ POSIX nào và perl
phải có sẵn trên hầu hết các Unice hiện đại ngoại trừ những ứng dụng đã trải qua nỗ lực loại bỏ nó.
sed -i
không phải là POSIX. Đó là GNU. FreeBSD sed
có một tùy chọn tương tự, nhưng bạn cần sed -i ''
ở đó.
-i
tạo một bản sao tạm thời (đó là lý do tại sao tôi nói các thay đổi được phản ánh trong tệp gốc); Tôi có nghĩa là bạn có được ngữ nghĩa tương tự như thay thế tại chỗ. Vui lòng kiểm tra xem câu trả lời được cập nhật có tuân thủ POSIX không.
$$
(id quá trình của shell hiện tại) như một phần của tên tệp tạm thời; nó tránh được nỗ lực nghĩ về một cái tên duy nhất được bảo đảm mỗi lần:command filename > filename.$$ && mv filename.$$ filename
:|paste -d'foo ' - - - - input > output
(đùa thôi, mặc dù có lẽ bạn sẽ thấy nó là giải pháp nhanh nhất được đăng ở đây: -b).
Cách thức kinh điển là:
sed 's/^/foo /' < input > output
Tuy nhiên, nó không dễ dàng thích nghi với các chuỗi tùy ý. Ví dụ,
sed "s/^/$var /"
Chỉ hoạt động nếu $var
không chứa, &
, \
, /
cũng không ký tự xuống dòng.
Về vấn đề đó,
export var
awk '{print ENVIRON["var"], $0}'
hoặc là
perl -pe '$_="$ENV{var} $_"'
sẽ làm việc tốt hơn
Tôi trình bày một giải pháp bằng cách sử dụng awk
trước chuỗi Foov.
awk '{ print "foo", $0; }' input > output
awk
là đa nền tảng và có sẵn trên bất kỳ hệ thống POSIX nào. Nó không thực hiện chỉnh sửa tại chỗ. Nếu bạn muốn chỉnh sửa một tệp mà không tạo tệp thứ hai, bạn sẽ phải sử dụng tệp tạm thời. Xem sed
câu trả lời của Joseph , nó hiển thị cú pháp. Một cách hack khác là sử dụng cú pháp sau, về cơ bản là tạo một tệp tạm thời có cùng tên tệp với tệp gốc.
{ rm file; awk '{ print "foo", $0 }' > file; } < file
reducto# wc -l foo
`914 foo` reducto# { rm foo ; awk '{ print "prepend" , $0 }' > foo } < foo
>
Điều này dường như không hoạt động. Tôi đã cố gắng vì việc chuyển hướng sang bản gốc khiến tôi lo lắng, nhưng nó thậm chí sẽ không bắt đầu.
Bạn có thể tránh các vấn đề về chỉnh sửa tại chỗ với các công cụ truyền phát bằng cách sử dụng một công cụ thường thực hiện chỉnh sửa tại chỗ - một trình chỉnh sửa!
ex sample.txt -c "%s/^/foo /" -c wq
Có một lợi thế nữa là các lệnh này dễ dàng và rõ ràng đối với bất kỳ ai thành thạo trong một trình soạn thảo thực sự.
Bạn có thể sử dụng perl
để làm điều này:
$ perl -pi -e 's/^/mystring /' afile.txt
Tạo một tệp mẫu.
$ seq 5 > afile.txt
$ cat afile.txt
1
2
3
4
5
Chạy lệnh trên:
$ perl -pi -e 's/^/mystring /' afile.txt
$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5
sed
, tôi đã chỉ ra cách sử dụng Perl .... không tìm kiếm một cuộc chiến thần thánh về vấn đề này.
Đơn giản chỉ cần sử dụng Bash
while IFS= read -r line; do echo "foo" "${line}" ; done < input > Output
Sử dụng Python
python -c "import sys; print 'foo '.join([ l for l in sys.stdin.readlines() ])" < input > Output
Nếu bạn muốn chỉnh sửa tại chỗ
import fileinput
import sys
for line in fileinput.input(['inputfile'], inplace=True):
sys.stdout.write('foo {l}'.format(l=line))
awk
trên các tệp rất nhỏ. Các hành vi khác nhau trên các triển khai tiếng vang và nó loại bỏ các khoảng trống hàng đầu và dấu và xử lý dấu gạch chéo ngược đặc biệt.
prefix () { while IFS= read -r REPLY; do printf "%s%s\n" "$1" "$REPLY"; done; }
nên được chính xác hơn.
{}
? Tôi nghĩ rằng @Matt đã gợi ý bạn biến nó thành một hàm được đặt tên, điểm nào {}
không có tên hàm?
Hoặc bạn có thể làm như sau:
vi filename.txt
Esc(để đảm bảo bạn đang ở NORMAL
chế độ), rồi nhập lệnh sau:
:1,$ s/^/mystring
1,$
bằng cách đơn giản %
. Điều này làm cho lệnh :%s/^/string/
.
-i
tắc không chỉnh sửa tệp tại chỗ. Nó tạo một tệp mới và ghi đè lên tệp gốc sau khi hoàn thành (bằng chứng: thay đổi inode). Không có nhiều công cụ thực sự chỉnh sửa tại chỗ, đây là một hoạt động nguy hiểm. Hơn nữa, vì bạn đề cập đến POSIX, công-i
tắc không bắt buộc phải tương thích với POSIXsed
, đây là một tính năng của một số triển khai cụ thể.