Làm cách nào để chỉnh sửa nhiều tệp văn bản bằng một lệnh?


18

Tôi muốn xóa dòng đầu tiên của nhiều tệp văn bản và thay thế nó bằng dòng khác. Có cách nào để làm điều này bằng cách sử dụng thiết bị đầu cuối?

Tôi biết cách sử dụng vim, có cách nào để tự động hóa nó với nó không? Tôi muốn tránh làm thủ công (như chỉnh sửa từng tệp riêng lẻ).

Nếu có thể tôi muốn tránh cài đặt các thư viện mới (đặc biệt là đối với những thứ tương tự mà tôi cho là rất đơn giản - nhưng tôi có thể sai).

Cảm ơn trước!

Câu trả lời:


21

Bạn có thể sử dụng sed:

sed -i.bak '1s/^.*$/new line/' *.txt

Điều này sẽ thay thế dòng đầu tiên của tất cả .txtcác tệp trong thư mục hiện tại bằng văn bản new line, thay đổi nó để đáp ứng nhu cầu của bạn.

Ngoài ra, các tệp gốc sẽ được sao lưu bằng .baktiện ích mở rộng, nếu bạn không muốn sử dụng:

sed -i '1s/^.*$/new line/' *.txt

Cảm ơn bạn! sedthực sự là những gì tôi đang tìm kiếm!
TomTsagk

@TomTsagk Vui mừng tôi có thể giúp :)
heemayl

11

Vâng, sử dụng vimchính nó:

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

Cái này làm gì

  • setline (n, text), tốt, là một chức năng thiết lập dòng nthành text.
  • call là cần thiết để gọi các chức năng.
  • bufdo được sử dụng để lặp lại một lệnh trên các bộ đệm (không có phạm vi, nó hoạt động trên tất cả các bộ đệm).
  • wqlưu và thoát khỏi bộ đệm. Chúng ta cần phải làm điều này trước khi chuyển sang bộ đệm tiếp theo, vì vậy lệnh này được kết nối với calllệnh bằng cách sử dụng| .
  • -c cmd chạy cmd là một lệnh chế độ lệnh sau khi tải bộ đệm đầu tiên.
  • Nes bật chế độ không tương thích, im lặng, chế độ cũ, tốt hơn cho xử lý không tương tác.

Những lợi ích:

  • Các setlinenội dung văn bản có thể được bất cứ điều gì - một &trong một sedvăn bản thay thế có thể có tác dụng ngoài ý muốn.

sedcó vẻ dễ sử dụng hơn nhiều, nhưng nó thực sự tuyệt vời vimcó thể làm như vậy! Cảm ơn rất nhiều cho câu trả lời của bạn!
TomTsagk

@TomTsagk tốt, tôi chỉ muốn minh họa cách bạn có thể hành động trên nhiều tệp ( bufdo). Hãy xem xét bạn có các tệp đã được mở và ... Và để hiển thị một thay thế 1s/foo/bar/.
muru

Tuyệt vời !!! <3_ <3
Campa

3

Một vài lựa chọn khác:

  • awk(cần một phiên bản GNU tương đối mới awk)

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Perl / vỏ

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • Vỏ / lõi

    $ for f in *txt; do 
        ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; 
      done
    

2

Kịch bản này sẽ làm như bạn yêu cầu, đặt các tệp đã thay đổi vào một thư mục mới mà không thực sự thay đổi bản gốc.

d=/tmp/cooked
mkdir $d
for f in *  #will match all files in current directory; adjust as desired
do
  echo "This is the new 1st line" > /${d}/${f}
  sed 1d ${f} >> /${d}/${f}
done

Tôi đã trả lời chậm (đã kiểm tra mã của tôi) ... và tôi thích giải pháp của heemayl tốt hơn rất nhiều!
Charles Boling

0

Sử dụng gawk

gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

Thí dụ

% cat foo.txt 
1
2
3
4

% cat bar.txt 
1
2
3
4

% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt                                                    
your_replacement
2
3
4

% cat bar.txt                                                    
your_replacement
2
3
4

0

jEdit: Tôi sử dụng nó để tìm hàng loạt và thay thế. Nó mạnh mẽ với khả năng sử dụng RegEx - Biểu thức chính quy. Bạn có thể thao tác trên các tệp trong một thư mục, chỉ định các phần mở rộng tệp, ví dụ: ".html", v.v. Và, bạn có thể xem ngôn ngữ của sự thay đổi ứng viên trong ngữ cảnh, trong GUI. jEdit là tuyệt vời.

jEdit có sẵn thông qua trung tâm phần mềm của Ubuntu.


0

Các lệnh đuôi và mèo sẽ làm điều này một cách dễ dàng:

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

Gói chúng trong một vòng lặp phù hợp và có thể sử dụng tệp tạm thời phù hợp và chính đáng thay vì tên tệp tạm thời được mã hóa cứng. Tôi tin rằng bash và các shell khác có cú pháp để tạo các tệp tạm thời.

Tùy chọn -n của đuôi có hai cách hiểu tùy thuộc vào việc đối số có dấu cộng hay không. Nếu nó có dấu cộng thì có nghĩa là hiển thị phần đuôi của tệp bắt đầu từ số dòng đã cho. Mặt khác, số là số dòng, bao gồm cả dòng cuối cùng, đuôi đó được cho là xuất ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.