LINUX.ORG.RU

SED - изменение строки

 


0

1

Имеется файл в котором необходимо заменить все строки типа

"// Какой-либо текст"
на
"///<summary>
\n(новая строка)
/// Какой-либо текст
\n(новая строка)
///</summary>".
Пробовал написать команду сам, вышло что-то вроде sed 's|\/\/|\/\/\/\<summary\>\n\/&', но уже тут появилась проблема в том, что не переводит на новую строку.

Читал про команды типо добавить пустую строку после нужной с помощью sed '\/\//G', но как добавить не пустую строку, так и не понял.



Последнее исправление: beastie (всего исправлений: 6)

вышло что-то вроде sed 's|\/\/|\/\/\/\<summary\>\n\/&'

Круто! Вот как надо:

sed 's/^\/\/ \(.*\)/\/\/\/\<summary\> \1\n\/\/\/\<\/summary\>/g'

pS
()
Последнее исправление: pS (всего исправлений: 1)
Ответ на: комментарий от pS

Такие выражения (c кучей '/') лучше записывать с другим разделителем:

sed 's#^// \(.*\)#///\<summary\>\n/// \1\n///\</summary\>#g'

anonymous
()

Такое использование \n — особенности GNU Sed. А вот на других системах нужно извращаться и писать $'\n'.

iVS ★★★★★
()
Ответ на: комментарий от pS

Либо у меня руки кривые, либо что-то не так с моей системой. Я запустил данную команду, а он все равно вставляет «тупо» н:
Было:

//                  UsersRoles.
Стало:
///<summary>n///                  UsersRoles.n///</summary>

Пробовал использовать $'\n', тоже самое. Попробовал \'\n\' - сломал команду. Может быть дело в том, что у меня OS X 10.10.3?

g6012038
() автор топика
Ответ на: комментарий от anonymous
dima$ sed -E 's/^\/\/ \(.*\)/\/\/\/\<summary\>\n\/\/\/ \1\n\/\/\/\<\/summary\>/g' Solver.cs
sed: 1: "s/^\/\/ \(.*\)/\/\/\/\< ...": \1 not defined in the RE
dima$ sed -E 's#^// \(.*\)#///\<summary\>\n/// \1\n///\</summary\>#g' Solver.cs
sed: 1: "s#^// \(.*\)#///\<summa ...": \1 not defined in the RE
dima$ sed -E 's#^// \(.*\)#///\<summary\>$'\n'/// \1\n///\</summary\>#g' Solver.cs
sed: 1: "s#^// \(.*\)#///\<summa ...": \1 not defined in the RE
g6012038
() автор топика
Ответ на: комментарий от anonymous

Результат такой же=( \x0A верная последовательность, так как это работает

dima$ echo -e "Hello\x0AMark\x0A\x0D"
Hello
Mark

g6012038
() автор топика
Ответ на: комментарий от anonymous

Может быть дело в том, что я использую sed «из коробки»? Т.е. я не устанавливал ничего отдельно, связанного с sed

dima$ sed --v
sed: illegal option -- -
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
dima$ sed -v
sed: illegal option -- v
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
dima$ sed -version
sed: illegal option -- v
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
dima$ sed --version
sed: illegal option -- -
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]

g6012038
() автор топика

awk нагляднее, нет такой мешанины символов


awk '/^\/\/\/ Какой-либо текст/ {print "///<summary>"; print "" } \
                                {print $0                       } \
     /^\/\/\/ Какой-либо текст/ {print ""; print "///</summary>"}'

anonymous
()
Ответ на: комментарий от g6012038

Итак, при отсутствии опции -E sed понимает подстановку \1, но не понимает \n; без опции -E — ситуация обратная. Давай пробовать варианты:

  • sed 's#^// \(.*\)#///\<summary\>\r/// \1\n///\</summary\>#g'
  • sed 's#^// \(.*\)#///\<summary\>\\n/// \1\n///\</summary\>#g'
  • sed 's#^// \(.*\)#///\<summary\>\\\n/// \1\n///\</summary\>#g'
  • sed 's#^// \(.*\)#///\<summary\>\x0A/// \1\n///\</summary\>#g'
  • sed 's#^// \(.*\)#///\<summary\>\x0D/// \1\n///\</summary\>#g'
  • sed 's#^// \(.*\)#///\<summary\>\$\'\n\'/// \1\n///\</summary\>#g'
pS
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.