Добавление строки в файл в команде cat?

Это известная ошибка: # 1353951. Он будет исправлен с последней версией сервера эволюционных данных (все еще в «предлагаемом»).

8
задан 24 October 2017 в 17:12

12 ответов

Вы можете использовать способность cat для чтения из stdin в сочетании с возможностью читать несколько файлов для достижения этого.

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

Вы также можете добавить строку, как таковую:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

Обратите внимание, что вы не ограничены одной строкой. cat будет читать от stdin, пока не достигнет EOF. Вы можете передать вывод из curl, например, для добавления или добавления к выходу cat.

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>
23
ответ дан 22 May 2018 в 17:11
  • 1
    (cat file.txt ; echo "My final line") | … также сделает это. Но с помощью cat для того, для чего он был создан, лучше +1. – ctrl-alt-delor 25 October 2017 в 00:30
  • 2
    @ ctrl-alt-delor: Sub-shells также имеет недостаток дополнительного процесса для fork, который относительно дорог. Попробуйте, например, echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | cat против ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cat или даже { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat. – David Foerster 25 October 2017 в 15:48

Вы можете использовать cat с возможность чтения из stdin в сочетании с его способность считывать несколько файлов, чтобы добиться этого.

~$ cat file.txt Hello from file.txt ~$ echo "My final line" | cat file.txt - Hello from file.txt My final line

Вы также можете добавлять строки, такие как:

~$ echo "My final line" | cat - file.txt My final line Hello from file.txt

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

~$ curl -s http://perdu.com | cat file.txt - Hello from file.txt <html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre> * <----- vous &ecirc;tes ici</pre></strong></body></html>
23
ответ дан 18 July 2018 в 04:39

Вы можете использовать способность cat для чтения из stdin в сочетании с возможностью читать несколько файлов для достижения этого.

~$ cat file.txt Hello from file.txt ~$ echo "My final line" | cat file.txt - Hello from file.txt My final line

Вы также можете добавить строку, как таковую:

~$ echo "My final line" | cat - file.txt My final line Hello from file.txt

Обратите внимание, что вы не ограничены одной строкой. cat будет читать от stdin, пока не достигнет EOF. Вы можете передать вывод из curl, например, для добавления или добавления к выходу cat.

~$ curl -s http://perdu.com | cat file.txt - Hello from file.txt <html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre> * <----- vous &ecirc;tes ici</pre></strong></body></html>
23
ответ дан 24 July 2018 в 18:08
sed -e '$aMy final line' file.txt

Из man sed опция -e

-e script, --expression=script
    add the script to the commands to be executed

$ соответствует последней строке, а a добавляет строку.

Если вы хотите для постоянного добавления строки к файлу используйте -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

Изменение команды на

sed -i -e '$aMy final line' file.txt
11
ответ дан 22 May 2018 в 17:11
  • 1
    Используйте одинарные кавычки, и вам не нужна обратная косая черта. – Wildcard 25 October 2017 в 07:10

Чтобы добавить строку к файлу, вы можете просто использовать оператор перенаправления оболочки append >> (файл будет open(2) -ed с флагом O_APPEND):

echo 'My final line' >>file.txt

Теперь, если вы хотите просто просмотреть содержимое файла с добавленной конечной строкой, я бы использовал cat с двумя аргументами:

Во-первых, ваш файл, очевидно, давайте file.txt Второй аргумент будет строкой по вашему выбору и передать строку как имя файла (поскольку cat касается только файлов), вы можете использовать подстановку процессов, <(), которая вернет дескриптор файла ([ f11].

Объединяя их вместе:

cat file.txt <(echo 'My final line')

Если вы хотите, чтобы вывод был выгружен, если less является вашим любимым пейджером:

less file.txt <(echo 'My final line')
8
ответ дан 22 May 2018 в 17:11

Это уже было разъяснено в комментариях к вопросу, но добавив его снова в качестве ответа здесь.

Команда, отмеченная в вопросе

(cat file.txt ; echo "My final line") | other command

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

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

5
ответ дан 22 May 2018 в 17:11
  • 1
    Если файл не заканчивается символом новой строки, я бы использовал awk: awk 1 file.txt; echo "My final line". awk 1 file - хороший трюк, чтобы компенсировать отсутствующий EOL в конце файла. – muru 25 October 2017 в 06:29

Чтобы добавить строку к файлу, вы можете просто использовать оператор перенаправления оболочки append >> (файл будет open(2) -ed с флагом O_APPEND):

echo 'My final line' >>file.txt

Теперь, если вы хотите просто просмотреть содержимое файла с добавленной конечной строкой, я бы использовал cat с двумя аргументами:

Во-первых, ваш файл, очевидно, давайте file.txt Второй аргумент будет строкой по вашему выбору и передать строку как имя файла (поскольку cat касается только файлов), вы можете использовать подстановку процессов, <(), которая вернет дескриптор файла (/proc/self/fd/<fd_number>).

Объединяя их вместе:

cat file.txt <(echo 'My final line')

Если вы хотите, чтобы вывод был выгружен, если less является вашим любимым пейджером:

less file.txt <(echo 'My final line')
8
ответ дан 18 July 2018 в 04:39
sed -e '$aMy final line' file.txt

Из man sed опция -e

-e script, --expression=script add the script to the commands to be executed

$ соответствует последней строке, а a добавляет строку.

Если вы хотите для постоянного добавления строки к файлу используйте -i

-i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if SUFFIX supplied)

Изменение команды на

sed -i -e '$aMy final line' file.txt
11
ответ дан 18 July 2018 в 04:39

Это уже было разъяснено в комментариях к вопросу, но добавив его снова в качестве ответа здесь.

Команда, отмеченная в вопросе

(cat file.txt ; echo "My final line") | other command

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

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

5
ответ дан 18 July 2018 в 04:39

для добавления строки в файл, вы можете просто использовать оболочку добавить оператор перенаправления, >> (файл будет open(2) с O_APPEND флаг):

echo 'My final line' >>file.txt

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

во-первых, ваш файл, очевидно, скажем, нажать [F8] второй аргумент будет строку вашего выбора, и, чтобы передать строку в качестве имени файла (как на [F9] имеет дело только с файлами) можно использовать процесс замещения, [F10] для того, что бы вернуть файловый дескриптор (на[F11].

поставив их вместе:

cat file.txt <(echo 'My final line')

если вы хотите, чтобы на выходе быть разбита на страницы, предполагая, less ваш любимый пейджер:

less file.txt <(echo 'My final line')
8
ответ дан 24 July 2018 в 18:08
sed -e '$aMy final line' file.txt

Из man sed опция -e

-e script, --expression=script add the script to the commands to be executed

$ соответствует последней строке, а a добавляет строку.

Если вы хотите для постоянного добавления строки к файлу используйте -i

-i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if SUFFIX supplied)

Изменение команды на

sed -i -e '$aMy final line' file.txt
11
ответ дан 24 July 2018 в 18:08
  • 1
    Используйте одинарные кавычки, и вам не нужна обратная косая черта. – Wildcard 25 October 2017 в 07:10

Это уже было разъяснено в комментариях к вопросу, но добавив его снова в качестве ответа здесь.

Команда, отмеченная в вопросе

(cat file.txt ; echo "My final line") | other command

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

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

5
ответ дан 24 July 2018 в 18:08
  • 1
    Если файл не заканчивается символом новой строки, я бы использовал awk: awk 1 file.txt; echo "My final line". awk 1 file - хороший трюк, чтобы компенсировать отсутствующий EOL в конце файла. – muru 25 October 2017 в 06:29

Другие вопросы по тегам:

Похожие вопросы: