Подтвердить что ты не робот

Unix команда для добавления текста в файл

Существует ли команда Unix для добавления некоторых строковых данных в текстовый файл?

Что-то вроде:

prepend "to be prepended" text.txt
4b9b3361

Ответ 1

sed -i.old '1s;^;to be prepended;' inFile
  • -i записывает изменение на место и создает резервную копию, если указано какое-либо расширение. (В данном случае .old)
  • 1s;^;to be prepended; заменяет начало первой строки заданной строкой замены, используя ; в качестве разделителя команд.

Ответ 2

printf '%s\n%s\n' "to be prepended" "$(cat text.txt)" >text.txt

Ответ 3

Замена процесса

Я удивлен, что никто не упомянул об этом.

cat <(echo "before") text.txt > newfile.txt

что, возможно, более естественно, чем принятый ответ (распечатка чего-либо и передача его в команду подстановки лексикографически нелогична).

... и угоня сказанное Райаном выше, с sponge вам не нужен временный файл:

sudo apt-get install moreutils
<<(echo "to be prepended") < text.txt | sponge text.txt

ОБНОВЛЕНИЕ: похоже, это не работает в Bourne Shell /bin/sh


Здесь строка (только zsh)

Используя здесь-строку - <<<, вы можете сделать:

<<< "to be prepended" < text.txt | sponge text.txt

Ответ 4

Это одна из возможностей:

(echo "to be prepended"; cat text.txt) > newfile.txt

вам, вероятно, нелегко обойти промежуточный файл.

Альтернативы (может быть громоздким при экранировании оболочки):

sed -i '0,/^/s//to be prepended/' text.txt

Ответ 5

Это будет работать для формирования результата. - означает стандартный вход, который через трубку подается из эха.

echo -e "to be prepended \n another line" | cat - text.txt

Чтобы переписать файл, требуется временный файл, так как он не может вернуться обратно во входной файл.

echo "to be prepended" | cat - text.txt > text.txt.tmp
mv text.txt.tmp text.txt

Ответ 6

Предпочитаю Адаму ответить

Мы можем упростить использование губки. Теперь нам не нужно создавать временный файл и переименовывать его с помощью

echo -e "to be prepended \n another line" | cat - text.txt | sponge text.txt

Ответ 7

Наверное, ничего встроенного, но вы могли бы написать свой собственный довольно легко, например:

#!/bin/bash
echo -n "$1" > /tmp/tmpfile.$$
cat "$2" >> /tmp/tmpfile.$$
mv /tmp/tmpfile.$$ "$2"

Что-то вроде этого хотя бы...

Ответ 8

Если допустимо заменить входной файл:

Примечание. Для этого могут иметь неожиданные побочные эффекты, особенно , заменяя символическую ссылку на обычный файл, возможно, заканчивая разными правами на файл и изменяя создание файла (рождение) дата.

sed -i, как в ответе Prince John Wesley, пытается как минимум восстановить исходные разрешения, но другие ограничения применяются.

 { printf 'line 1\nline 2\n'; cat text.txt; } > tmp.txt && mv tmp.txt text.txt

Примечание. Использование групповой команды { ...; ... } более эффективно, чем использование подоболочки ((...; ...)).


Если входной файл должен быть отредактирован на месте (сохраняя свой индексный дескриптор со всеми его атрибутами):

Использование почтенного ed Утилита POSIX:

Примечание: ed всегда считывает входной файл в целом в память.

ed -s text.txt <<'EOF' 
1i
line 1
line 2
.
w
EOF
  • -s подавлено сообщения о статусе ed.
  • Обратите внимание, как команды предоставляются ed как многострочный здесь-документ (<<'EOF' ... EOF), то есть через STDIN.
  • 1i делает 1 (1-я строка) текущей строкой и запускает режим вставки (i).
  • Следующие строки - это текст, который нужно вставить перед текущей строкой, заканчивающийся . в своей строке.
  • w записывает результат обратно во входной файл (для тестирования замените w на ,p только для печати результата без изменения входного файла).

Ответ 9

В некоторых случаях предварительный текст может быть доступен только из stdin. Тогда эта комбинация будет работать.

echo "to be prepended" | cat - text.txt | tee text.txt

Если вы хотите опустить вывод tee, добавьте > /dev/null.

Ответ 10

Решение:

printf '%s\n%s' 'text to prepend' "$(cat file.txt)" > file.txt

Обратите внимание, что это безопасно для всех типов входов, потому что нет расширений. Например, если вы хотите добавить [email protected]#$%^&*()ugly text\n\t\n, он будет работать:

printf '%s\n%s' '[email protected]#$%^&*()ugly text\n\t\n' "$(cat file.txt)" > file.txt

Последняя часть, оставленная для рассмотрения, - удаление пробелов в конце файла во время подстановки команды "$(cat file.txt)". Все обходные пути для этого относительно сложны. Если вы хотите сохранить новые строки в конце файла file.txt, см. Это: fooobar.com/questions/26162/...

Ответ 11

Другой способ: sed:

sed -i.old '1 {i to be prepended
}' inFile

Если строка, которая должна быть добавлена, является многострочной:

sed -i.old '1 {i\ 
to be prepended\
multiline
}' inFile

Ответ 12

Как проверено в Bash (в Ubuntu), если начать с тестового файла через;

echo "Original Line" > test_file.txt

вы можете выполнить;

echo "$(echo "New Line"; cat test_file.txt)" > test_file.txt

или, если версия bash слишком старая для $(), вы можете использовать обратные метки;

echo "'echo "New Line"; cat test_file.txt'" > test_file.txt

и получите следующее содержимое "test_file.txt";

New Line
Original Line

Нет промежуточного файла, просто bash/echo.

Ответ 13

Еще одно довольно прямое решение:

    $ echo -e "string\n" $(cat file)

Ответ 14

Если вам нравится vi/vim, это может быть больше вашего стиля.

printf '0i\n%s\n.\nwq\n' prepend-text | ed file

Ответ 15

# create a file with content..
echo foo > /tmp/foo
# prepend a line containing "jim" to the file
sed -i "1s/^/jim\n/" /tmp/foo
# verify the content of the file has the new line prepened to it
cat /tmp/foo

Ответ 16

Я бы порекомендовал определить функцию, а затем импортировать и использовать ее там, где это необходимо.

prepend_to_file() { 
    file=$1
    text=$2

    if ! [[ -f $file ]] then
        touch $file
    fi

    echo "$text" | cat - $file > $file.new

    mv -f $file.new $file
}

Тогда используйте это так:

prepend_to_file test.txt "This is first"
prepend_to_file test.txt "This is second"

В таком случае содержимое вашего файла будет:

This is second
This is first

Я собираюсь использовать этот подход для реализации средства обновления журнала изменений.