Перенос строки в переменную

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

antake
Сообщения: 8

Перенос строки в переменную

Сообщение antake »

Добрый день!

Никак не могу решить такую проблемку. Как добавить перенос строки в переменную на bash?
Чтобы получить после echo $x примерно такую штуку:
sed '{/q/w/
t
n
}' file

Подскажите, кто-нибудь?)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Перенос строки в переменную

Сообщение SLEDopit »

Код: Выделить всё

echo -e "sed '{/q/w\nt\nn\n}' file"
вы про это?
или про замену переноса строки sed'ом?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
antake
Сообщения: 8

Re: Перенос строки в переменную

Сообщение antake »

Спасибо за внимание, да. про это.
Или так вообще нельзя сделать? Я вообще в скрипте на bash хочу создать команду sed и ее выполнить. А там должны быть переносы.
Спасибо сказали:
FatZer
Сообщения: 33
ОС: Gentoo

Re: Перенос строки в переменную

Сообщение FatZer »

antake писал(а):
29.01.2013 15:07
sed '{/q/w/

тут s, видать, пропустил?
используй ;
sed 's/q/w/;t;n' file
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Перенос строки в переменную

Сообщение SLEDopit »

antake писал(а):
29.01.2013 15:41
Или так вообще нельзя сделать? Я вообще в скрипте на bash хочу создать команду sed и ее выполнить. А там должны быть переносы.
1. В sed необязательны переносы. Можно использовать ';' вместо переноса.
2. Я же показал пример, как это делается. Ну и по аналогии.
3. С точки зрения безопасности, программно сгенерённый код для выполнения - дыра в оной. Если что-то создаётся для реальной системы, а не в учебных целях, следует как минимум озаботитьтся проверкой валидности получившегося кода.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
antake
Сообщения: 8

Re: Перенос строки в переменную

Сообщение antake »

FatZer, я наугад буквы написал в команде

SLEDopit,
1) Спасибо, так и сделаю
2)Я все-таки хотел именно команду выполнить, а не на экран вывести. Предыдущий пункт меня устроит, но уже интересно, с переносами видимо это не сделать?
3)Мне надо заменить некоторые слова в файлах на слова из других файлов. Разве в любом случае не придется программно код генерить?
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Перенос строки в переменную

Сообщение sciko »

antake писал(а):
29.01.2013 16:04
Мне надо заменить некоторые слова в файлах на слова из других файлов. Разве в любом случае не придется программно код генерить?

Думаю, нужен пример.
Если вы делаете рефакторинг и замеряете имя функции very_long_function_name_265 на short_name, то это ещё можно сделать через sed. А вот наоборот велика вероятность, что вы замените и имя переменной func_short_name. Особенно это весело, когда у вас есть переменная func_very_long_function_name_265. Тогда есть большая вероятность что код скомпилится, но будут появляться мерцающие ошибки.

Поэтому лучше всё 100 раз проверить и лишь 1 раз заменить.
Спасибо сказали:
antake
Сообщения: 8

Re: Перенос строки в переменную

Сообщение antake »

И все-таки sed не позволяет заменить перенос на запятую.

Код:

morozov@cwb:~/BashStudy/test/src$ sed '/[ ]*#include[ ]*</{ s/\([ ]*\)#include\([ ]*\)<Globals.h>\(.*\)/#inlcude<Globals.h>/i > t > }' Globals.cpp #include <object.h> #inlcude<Globals.h> #include <generate.h> morozov@cwb:~/BashStudy/test/src$ sed '/[ ]*#include[ ]*</{ s/\([ ]*\)#include\([ ]*\)<Globals.h>\(.*\)/#inlcude<Globals.h>/i, t }' Globals.cpp sed: -e expression #1, char 87: unknown option to `s'



Да вообще часто случается, что надо перепроверить 100 раз, в этом наша работа и заключается)
Мне надо регистры заголовочных файлов поменять. Образцы я беру из реальных файлов.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Перенос строки в переменную

Сообщение sciko »

Если разговор идёт о "\n", то sed с переносом строки работает весьма криво и многое зависит от версии sed.
В этом случае лучше использовать perl или python (что знаете лучше).
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Перенос строки в переменную

Сообщение /dev/random »

antake писал(а):
29.01.2013 16:46
И все-таки sed не позволяет заменить перенос на запятую.

Во-первых, вам предлагали ; (точку с запятой), а не , (запятую).
Во-вторых, перенос строки тоже можно вставить: $'\n'.
Спасибо сказали:
antake
Сообщения: 8

Re: Перенос строки в переменную

Сообщение antake »

Оу, и правда) С ; все сработало.
Перенос еще попробую сделать.

Спасибо всем.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Перенос строки в переменную

Сообщение SLEDopit »

antake писал(а):
29.01.2013 16:04
3)Мне надо заменить некоторые слова в файлах на слова из других файлов. Разве в любом случае не придется программно код генерить?
см. уточнение про валидацию.
antake писал(а):
29.01.2013 16:46
sed '/[ ]*#include[ ]*</{ s/\([ ]*\)#include\([ ]*\)<Globals.h>\(.*\)/#inlcude<Globals.h>/i
Зачем здесь t? Зачем так сложно? Если я правильно понял, вам нужно убрать все пробелы в строке с #inlcude <Globals.h>

Код: Выделить всё

sed '/^\s*#include\s*<Globals.h>/s/\s*//g'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
antake
Сообщения: 8

Re: Перенос строки в переменную

Сообщение antake »

Нет, мне надо было заменить регистр букв в заголовочных файлах.
Количество пробелов я сохранял только потому, что задача и правда учебная, на практике, конечно, выписывал бы в едином виде #include <Global.sh>
t я сделал, потому что в одной строке не бывает двух include, чтобы попусту не проверялись остальные команды.
Про валидацию я так и не понял. Да, сложно проверять, а что делать?
Спасибо сказали: