Похож на Вас, используют локаль не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'.
Использовать 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
).
Вы хотите вставить текст перед первой строкой, а не добавить его после, так использование
sed '1 i\
your_text' your_file
Здесь документ может также помочь:
cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
Вы можете использовать Vim в режиме Ex:
ex -sc '1i|ALFA BRAVO' -cx file
1
выберите первую строку
i
вставить текст и новую строку
x
сохранить и закрыть
sed -i '1i new_text' file_name
Если вы не укажете параметр -i
, он не будет отображать никаких ошибок и отобразит вывод на стандартном терминале. , но не вставляет текст в файл.
Использование GNU awk >= 4.1:
awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh
В противоположность всем ответам sed
, это работает и на пустых файлах.
Команда 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 сохранить изменения в файле и выйти.
Эхо используется для получения текста. Cat filename - печатает файл в консоли и> использует его для отправки в другой файл filename1, а затем мы перемещаем filename1 в filename, чтобы вставить текст в первую строку желаемого файла.
(echo "some text" && cat filename) > filename1 && mv filename1 filename
К сожалению, все ответы выше (в основном с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
Я удивлен, что в этом старом вопросе никто не показал самую распространенную (и довольно простую в данном случае )команду 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
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
)и разрывами строк экранировано \
для удобочитаемости.
1i\
для «вставки в строке 1». $a\
для «в строке <последняя> добавить». $
помещается перед 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 ",
" "
]
}
Добавление текста hello перед первой строкой без возврата каретки или перевода строки в файл myfile
sed -i '1s/^/hello /' myfile
Это также не приведет к выводу всего файла на терминал.
У меня были проблемы с BSD sed (MacOS )и вставкой текста из переменной, вот как я это сделал:
headers=a,b,c
sed -i '' -e "1{x;s/^.*/$headers/p;x;} some_file"
Пояснение
1{...}
Это влияет только на первую строку x
поменять местами текущую строку с местом хранения (в настоящее время пустым)s/../../p
заменяет (теперь пустую строку )ожидаемым текстом (это позволяет избежать проблемы разрыва строки -)и выводит ее (, поэтому первая строка будет напечатана)x
снова поменять местами, извлекая первую строку файла, которая находилась в пространстве хранения, в пространство шаблонов Точно так же, как ответ Анкит Шаха:
(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.
# ...
Если кому интересно, моя проблема заключалась в том, чтобы вставить одну и ту же строку заголовка в несколько файлов. Благодаря предложенному решению я придумал это:
sed -i 1i\ $(cat header_line) data.csv
где header_line
— файл, содержащий нужную первую строку,
Чтобы вставить текст в первую строку и поместить остальную часть в новую строку, используя sed в macOS, это сработало для меня
sed -i '' '1 i \
Insert
' ~/Downloads/File-path.txt
-i
опция. Я обновлю Ваш ответ перед принятием. – Manolo 08.11.2013, 14:07sed '1 i\this text is entered above the existing first line' file
работы для меня. – 08.11.2013, 15:47sed (GNU sed) 4.2.2
простоsed '1 i text to insert' -i file
обработанный как очарование. Спасибо – ton 15.02.2016, 16:06