Как вставить текст перед первой строкой файла?

Похож на Вас, используют локаль неPOSIX.

Попытка:

export LC_ALL=C

и затем sort.

info sort ясно говорит:

(1) Если Вы используете локаль неPOSIX (например, установкой 'LC_ALL' к 'en_US'), то 'вид' может произвести вывод, который отсортирован по-другому, чем Вы приучены к. В этом случае установите переменную среды 'LC_ALL' на 'C'. Обратите внимание, что установка только 'LC_COLLATE' имеет две проблемы. Во-первых, это неэффективно, если 'LC_ALL' также установлен. Во-вторых, это имеет неопределенное поведение, если 'LC_CTYPE' (или 'ЛЕНГ', если 'LC_CTYPE' сброшен) установлен на несовместимое значение. Например, Вы получаете неопределенное поведение, если 'LC_CTYPE' является 'ja_JP.PCK', но 'LC_COLLATE' является 'en_US.UTF-8'.

78
26.07.2017, 07:11
15 ответов

Использовать sedвставьте (i) опция, которая вставит текст в предыдущую строку.

sed '1 i\

Обновление автора вопроса:

Заставить его отредактировать файл на месте - с GNU sed - Я должен был добавить -i опция:

sed -i '1 i\anything' file

Также синтаксис

sed  -i '1i text' filename

Для не-GNU sed

Необходимо сразу поразить клавишу Return после обратной косой черты 1i\ и после first_line_text:

sed -i '1i\
first_line_text
'

Также обратите внимание что некоторый не-GNU sed реализации (например, та на macOS) требуют аргумента в пользу -i флаг (использование -i '' получить тот же эффект как с GNU sed).

108
27.01.2020, 19:31
  • 1
    Это не работает без -i опция. Я обновлю Ваш ответ перед принятием. –  Manolo 08.11.2013, 14:07
  • 2
    спасибо. Что ОС Вы используете? Исходное решение работало над OpenSuse 9. –  suspectus 08.11.2013, 14:22
  • 3
    Интересный! Я нахожусь на Lubuntu 13.10 и sed '1 i\this text is entered above the existing first line' file работы для меня. –   08.11.2013, 15:47
  • 4
    Здесь, использование sed (GNU sed) 4.2.2 просто sed '1 i text to insert' -i file обработанный как очарование. Спасибо –  ton 15.02.2016, 16:06
  • 5
    Не работает над пустыми файлами. –  rudimeier 28.09.2016, 23:32

Вы хотите вставить текст перед первой строкой, а не добавить его после, так использование

sed '1 i\
your_text' your_file

Здесь документ может также помочь:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
7
27.01.2020, 19:31

Вы можете использовать Vim в режиме Ex:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 выберите первую строку

  2. i вставить текст и новую строку

  3. x сохранить и закрыть

18
27.01.2020, 19:31
sed  -i '1i new_text' file_name

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

6
27.01.2020, 19:31

Использование GNU awk >= 4.1:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

В противоположность всем ответам sed, это работает и на пустых файлах.

11
20.08.2021, 13:02

Команда 0a , которую вы пытались выполнить , работает в ex , предшественнике vi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

printf Команда сама по себе выводит:

0a
Anything you want to add
.
x

0a означает добавление после 0-й строки (т.е. перед первой строкой).

Следующая строка или несколько строк - это буквальный текст, который нужно добавить.

. в отдельной строке завершает команду «добавить».

x заставляет Ex сохранить изменения в файле и выйти.

4
20.08.2021, 13:02

Эхо используется для получения текста. Cat filename - печатает файл в консоли и> использует его для отправки в другой файл filename1, а затем мы перемещаем filename1 в filename, чтобы вставить текст в первую строку желаемого файла.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename
33
20.08.2021, 13:02

К сожалению, все ответы выше (в основном сsed)у меня не сработали, так как все они заменяли первую строку. Я на машине Ubuntu 16.04 LTS. Вот мой обходной путь сGNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name
0
20.08.2021, 13:02

Я удивлен, что в этом старом вопросе никто не показал самую распространенную (и довольно простую в данном случае )команду sed:

$ sed  -i '1s/^/new_text\
/' file_name

Который работает в большинстве оболочек и переносим на несколько версий sed при условии, что файл содержит хотя бы одну допустимую строку.
Если GNU sed доступен, вы можете использовать это:

$ sed -i '1s/^/new_text\n' file_name

Разница в том, что GNU sed позволяет использовать \nдля новой строки, а другим требуется буквальный перевод строки, которому предшествует обратная косая черта (, которые также работают в GNU sed в любом случае ).

Если используется оболочка, которая принимает синтаксис $'…', вы можете вставить новую строку напрямую, чтобы sed увидел, что новая строка уже существует:

$ sed -i $'1s/^/new_text\\\n/' file_name

Это работает для большего количества версий sed.

Если в файле нет строк (т.е. :он пустой )просто:

$ echo "new_text" > file_name
2
20.08.2021, 13:02

sedможно вставить (несколько раз )перед первым и после последнего

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

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 выполняют замены
    • Сценарий 4 применяется только к "строке <последняя>" из-за того, что $помещается перед s/.

Результатом является преобразование вывода команды в действительный 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        ",
    "                      "
  ]
}
-2
20.08.2021, 13:02

Добавление текста hello перед первой строкой без возврата каретки или перевода строки в файл myfile

sed -i '1s/^/hello /' myfile

Это также не приведет к выводу всего файла на терминал.

0
20.08.2021, 13:02

У меня были проблемы с BSD sed (MacOS )и вставкой текста из переменной, вот как я это сделал:

headers=a,b,c
sed -i '' -e "1{x;s/^.*/$headers/p;x;} some_file"

Пояснение

  • 1{...}Это влияет только на первую строку
  • xпоменять местами текущую строку с местом хранения (в настоящее время пустым)
  • s/../../pзаменяет (теперь пустую строку )ожидаемым текстом (это позволяет избежать проблемы разрыва строки -)и выводит ее (, поэтому первая строка будет напечатана)
  • xснова поменять местами, извлекая первую строку файла, которая находилась в пространстве хранения, в пространство шаблонов
1
20.08.2021, 13:02

Точно так же, как ответ Анкит Шаха:

(echo "some text" && cat filename) > /tmp/filename && cat /tmp/filename > filename

Использовать такую ​​длинную команду неудобно, поэтому я создаю простую функцию bash (в.bashrc или где-либо еще ), как показано ниже:

echo0 () {
  (echo ${@:2} && cat $1) > /tmp/$1
  cat /tmp/$1 > $1
}
# $1 is your-file-name, ${@:2} are contents after "your-file-name".
# How to use:
#   > echo0 myfile hellow world etc.
#   > head myfile
#     hellow world etc.
#    ...
0
20.08.2021, 13:02

Если кому интересно, моя проблема заключалась в том, чтобы вставить одну и ту же строку заголовка в несколько файлов. Благодаря предложенному решению я придумал это:

sed -i 1i\ $(cat header_line) data.csv

где header_line— файл, содержащий нужную первую строку,

0
20.08.2021, 13:02

Чтобы вставить текст в первую строку и поместить остальную часть в новую строку, используя sed в macOS, это сработало для меня

sed -i '' '1 i \
Insert
' ~/Downloads/File-path.txt
1
11.11.2021, 21:30

Теги

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