SED: вставити текст після останнього рядка?


76

Команда вставляє тег на початку файлу:

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

Як я можу вставити щось до кінця кожного файлу за допомогою SED?


3
{ cat file; echo 'END OF FILE'; } > newFile , це також працює завдяки ш. *. (не sed, але працює і просто)

4
простий echo "Cool Text" >> fileтакож повинен зробити трюк.
Данпе

Відповіді:


93

sed -e "\$aTEXTTOEND" є найпростішим способом.

Як це працює

$відповідає останньому рядку (це звичайна sedадреса; 4aTEXTTOENDбуде вставлена ​​після четвертого рядка), aє командою додавання і TEXTTOENDє чим додати.


Втечі $ as $$ у Makefile.
stevesliva

Для OS X sed -e '$a\NEWLINE\\'. Замініть NEWLINE фактичним новим рядком.
Хорхе Букаран

13
sed -i -e "\ $ aTEXTTOEND" <ім'я файла> буде повною командою.
Lasse Meyer

2
не працює на macos. Немає коментаря навіть Хорхе Букарань: sed: 1: "$ a \ NEWLINE \\": додаткові символи після \ в кінці команди
Емануеле Паоліні

1
У debian 9 він додає новий рядок замість додавання в кінці останнього рядка.
Лучано Андресс Мартіні

31

У sedцьому випадку використовувати не потрібно . Як щодо

echo "<?php" >> file

2
Щоправда, але ви можете здогадатися, що випадок використання ОП є дужкою файлу з " <php " і " >", і цитування вибраного вмісту за один раз, тому він, мабуть, дійсно хоче sedфрагмент.
dmckee

2
Також якщо ви зробите це та не хочете нового рядка, використовуйте echo -n
Vinko Vršalovic

2
Я не люблю здогадуватися. Кожен раз, коли я намагаюся, я помиляюся.

4
Ще одна причина, чому прийнята відповідь є більш корисною, це у випадку попередження цього sudo, що призводить до невдачі цієї зміни, оскільки echoце вбудована команда оболонки, а не виконуваний файл, знайдений у$PATH
Tony Cesaro

@TonyCesaro: echoце вбудований, але також виконуваний файл, знайдений у$PATH
Zan Lynx

24

Тоді припустимо, що ви хочете помістити кінцевий тег php у файли

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

повинен зробити трюк


1
Це добре працює у випадках, коли бажані довільні маніпуляції з останнім рядком введення. Дякую!
Джей Тейлор



3

Використовуйте команду sed 'append (a)'. Наприклад, додати два рядки в кінці файлу:

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

2

Простим способом записати та внести зміни до вмісту в певний рядок у файлі. Якщо ви хочете вставити що-небудь під певний номер рядка, тоді можна використовувати команду нижче:

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

де 2i- рядок №2 і i означає вставку. Якщо вам потрібно вставити останній рядок, тоді використовуйте $замість 2. я почав - текст, який потрібно вставити, і sheikh.logє ім'ям файлу.

Ми також можемо внести зміни в рядку, скориставшись командою нижче

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

iзмінено на we.


-1

Перший і останній

Я б припустив, що кожен, хто шукав, як вставити / додати текст до початку / кінця файлу, ймовірно, також повинен знати, як робити і інші.

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

Пояснення

Цей calвисновок передається на gnu- sed(викликається gsedна macOS, встановленому через brew.sh ) з розширеним RegEx ( -E) та застосованими 6 "скриптами" ( -e) та розривами рядків, \для яких можна зрозуміти. Сценарії 1 та 2 використовують 1i\для "у рядку 1, вставити". Сценарії 5 та 6 використовують $a\для "у рядку <остання>, додати". Я вертикально вирівнював текстові виходи, щоб код відображав те, що очікується в результаті. Сценарії 3 та 4 роблять підстановки (останні застосовуються лише до "рядка <остання>"). Результатом є перетворення командного виводу в допустимий JSON.

вихід

{
  "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        ",
    "                      "
  ]
}

Поки я не голосував за ваше запитання, зауважте, що у нас вже є кілька відповідей, включаючи прийнятий, які демонструють бажаний результат.
Джефф Шаллер

@JeffSchaller Спільнота Exchange Exchange не є форумом. Її мета поширюється на те, щоб допомогти ОП розблокуватись. Мета полягає в засіданні глобальної бази знань багатьма варіантами, на які шукачі можуть натрапити, шукаючи відповіді. Я назвав свою відповідь причиною того, щоб допомогти користувачам розпізнати корисність цієї відповіді, перш ніж вони навіть натиснуть результат Google.
Бруно Броноський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.