Cách lấy dòng đầu tiên của tệp văn bản đầu vào, trong khi xóa dòng đó khỏi tệp văn bản


11

Làm cách nào tôi có thể nhận được dòng đầu tiên của tệp văn bản đầu vào, trong khi xóa dòng đó khỏi tệp văn bản?

Nếu tôi có một tập tin văn bản /myPathToTheFile.txtnhư thế này

► put returns between paragraphs
► for linebreak add 2 spaces at end
► _italic_ or **bold**

Tôi muốn lấy dòng này làm đầu ra

► put returns between paragraphs

và tập tin văn bản của tôi sẽ như thế này

► for linebreak add 2 spaces at end
► _italic_ or **bold*

Lưu ý rằng chi phí của thao tác này tỷ lệ thuận với kích thước tệp. Vì vậy, nếu tệp lớn và bạn làm điều này thường xuyên, nó sẽ rất chậm.
CodeInChaos

Câu trả lời:


13
ex -s /myPathToTheFile.txt <<\EX
1p
1d
wq
EX

hoặc là

ex -s /myPathToTheFile.txt <<< 1p$'\n'1d$'\n'wq

hoặc, ít gõ:

ed -s /myPathToTheFile.txt <<< $'1\nd\nwq'

Wow, sử dụng tốt ed ...!
qwr

10

Ít nhất là với GNU sed:

$ cat file
► put returns between paragraphs
► for linebreak add 2 spaces at end
► _italic_ or **bold**

$ sed -i '1{
w /dev/stdout
d}' file
► put returns between paragraphs

$ cat file
► for linebreak add 2 spaces at end
► _italic_ or **bold**

Với GNU sed, nó có thể được viết dưới dạng một lớp lót

sed -i -e '1 {w /dev/stdout' -e 'd}' file

6

Giả sử bạn đang yêu cầu một kịch bản shell, điều này sẽ làm những gì bạn yêu cầu:

NAME=$1
head -n 1 $NAME
sed -i '1d' $NAME


2

Bạn có thể sử dụng head, tailmv:

Hiển thị dòng đầu tiên:

head -1 myPathToTheFile.txt

Giữ các dòng ( +2) cuối cùng :

tail -n +2 myPathToTheFile.txt > file.tmp && mv file.tmp myPathToTheFile.txt

1

Sử dụng mô tả tập tin và một chút python

{
    { 
    head -n1 >&3; 
    3>&- tail -n +1;
    3>&- python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())';
    }<file 1<>file
} 3>&1

1

Sử dụng đầu và đuôi. Tệp là target.txt

head -1 target.txt && tail -n+2 target.txt > tmp
mv tmp target.txt && rm tmp

Lưu ý: Đảm bảo không có tệp tmp hiện có trong thư mục hiện tại, nếu không nó sẽ bị xóa.

Giải trình:

  • "đầu -1" chọn dòng đầu tiên
  • "tail -n + 2 target.txt> tmp" chọn tất cả các dòng từ thứ 2 trở đi (bao gồm) và đặt chúng vào tmp
  • mv ghi đè tập tin gốc bằng tmp
  • rm tmp sẽ xóa tệp tmp do đó được tạo
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.