it-mot-dan-vi.com

SED: chèn văn bản sau dòng cuối cùng?

Điều này lệnh sed chèn một thẻ vào đầu tệp:

sed -i "1s/^/<?php /" file

Làm cách nào tôi có thể chèn một cái gì đó vào cuối end của mỗi tệp bằng sed?

82
user2362

sed -e "\$aTEXTTOEND" là cách đơn giản nhất.

Làm thế nào nó hoạt động

$ khớp với dòng cuối cùng (đó là địa chỉ sed bình thường; 4aTEXTTOEND sẽ chèn sau dòng thứ tư), a là lệnh chắp thêm và TEXTTOEND là những gì cần nối thêm.

101
bseller

Không cần sử dụng sed trong trường hợp đó. Làm thế nào về

echo "<?php" >> file
34
innaM

Giả sử bạn muốn đặt thẻ php kết thúc vào các tệp, sau đó

sed -i '$s/$/\n?>/' file

nên làm mánh khóe

25
Vinko Vrsalovic

Xem bài viết gốc của bạn để biết tất cả trong một lệnh sed.

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;
5
Tim Desjardins

Sử dụng lệnh sed 'append (a)'. Ví dụ: để nối hai dòng ở cuối tệp:

sed -i -e '$a\
foo1 bar1\
foo2 bar2' file
5
user2802945

Một cách đơn giản để viết và thực hiện các thay đổi trong nội dung tại một dòng cụ thể trong một tệp. Nếu bạn muốn chèn bất cứ thứ gì vào một số dòng cụ thể thì có thể sử dụng lệnh bên dưới:

sed -i '2i i have started' sheikh.log

ở đâu 2i - dòng số 2 và i là viết tắt của chèn. Nếu bạn phải chèn ở dòng cuối cùng thì hãy sử dụng $ ở vị trí 2. tôi đã bắt đầu - văn bản được chèn và sheikh.log là tên tệp.

Chúng tôi cũng có thể thực hiện các thay đổi trong dòng bằng cách sử dụng lệnh dưới đây

sed -i '2c we have started' sheikh.log

i được đổi thành we.

2

Không có dòng trả về/vận chuyển thêm văn bản hello vào cuối dòng và chỉnh sửa tệp tại chỗ mà không xuất ra thiết bị đầu cuối

sed -i '$s/$/hello/' file
0
FastGTR

Tương đương với sed -i '1s/^/<start</' file Của bạn sẽ là:

sed -i '$s/$/>end>/' file

Điều đó sẽ thêm văn bản >end> Vào dòng cuối cùng (không có dòng mới) của tệp. Tất nhiên, trong trường hợp này (như trong ví dụ của bạn cũng vậy) nó cần tệp chứa ít nhất một dòng (không trống).

Sử dụng dấu ngoặc kép (như trong câu trả lời đã chọn) không phải là ý hay vì khi đó Shell sẽ cố gắng xử lý từng $ Trong chuỗi. Lệnh sẽ chuyển đổi thành:

sed -i "\$s/\$/>end>/" file

Sử dụng a (chắp thêm, kết thúc) hoặc i (chèn, bắt đầu) cũng sẽ chèn một dòng mới, yêu cầu các cuộc gọi khác nhau trong BSD và GNU và vẫn cần một tập tin không trống.

Đối với GNU:

$ sed '1i<start<' file
$ sed '$a>end>' file

Đối với BSD:

$ sed '1i\
<start<' file
$ sed '$a\
>end>' file

Hoặc, trong các shell cho phép nó (chuỗi C):

$ sed $'1i\\\n<start<' file
$ sed $'$a\\\n>end>' file

Tất nhiên, không có gì đơn giản hơn:

echo '>end>' >> file

mà làm việc với các tập tin trống là tốt.

0
Isaac

Đầu tiên và cuối cùng

Tôi cho rằng bất cứ ai tìm kiếm cách chèn/nối văn bản vào đầu/cuối của một tập tin cũng có thể cần phải biết cách làm khác.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

Giải trình

Đây là cal đầu ra được chuyển thành gnu -sed (được gọi là gsed trên macOS được cài đặt qua brew.sh ) với RegEx mở rộng (-E) và 6 "tập lệnh" được áp dụng (-e) và ngắt dòng thoát với \ để dễ đọc. Tập lệnh 1 & 2 sử dụng 1i\ đến "tại dòng 1, chèn". Tập lệnh 5 & 6 sử dụng $a\ thành "tại dòng <cuối>, nối thêm". Tôi căn chỉnh theo chiều dọc các đầu ra văn bản để làm cho mã đại diện cho những gì được mong đợi trong kết quả. Tập lệnh 3 & 4 thực hiện thay thế (đoạn sau chỉ áp dụng cho "dòng <cuối>"). Kết quả là chuyển đổi đầu ra lệnh thành JSON hợp lệ.

đầu ra

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}
0
Bruno Bronosky