Требуется дополнительная обратная косая черта в первой добавленной новой строке в sed

La imagen que muestra etiqueta los puntos de inicio de las diferentes partes, y las líneas en zigzag -en el cuadro "Entradas 5 -128" significan que el cuadro no está dibujado a escala. Representa un bloque de 31 sectores LBA, pero visualmente se dibuja alrededor de 2 -3 veces el tamaño de un bloque de un -sector. Las etiquetas cuentan la historia real, por lo que el primer sector LBA que puede usar para una partición es #34, que es 34 *512 = 17408 bytes desde el principio.

Sin embargo, eso no significa que deba iniciar una partición allí. Con los discos modernos (grandes )que tienen un tamaño de bloque físico de 4096, probablemente desee iniciar las particiones en un límite que se alinee con eso. Es bastante común comenzar en LBA 2048, es decir, 1 MB, lo cual es excesivo para ese propósito, pero al menos no tendrá problemas de alineación en el futuro cercano.

Por lo general, el software de partición que utilice elegirá los puntos de inicio apropiados para las particiones y se asegurará de no superponer otras particiones o la tabla de particiones.

2
18.07.2019, 16:11
2 ответа

Это не совсем задокументированное поведение, но в целом это расширение. Все три команды, которые были расширены аналогичным образом (a, iи c), ведут себя так же, как :начальный пробел игнорируется, и если текст начинается с \, то он отбрасывается. По сути, не имеет значения, какая из этих форм используется :

.
i foo
i \foo
i \
foo

Они все одинаковые. (Я знаю, что использовал iздесь, но проверьте описания a, iи c-, это сюрреалистично.)

И код показывает столько же:

1111         case 'a':
1112         case 'i':
1113         case 'c':
1114           ch = in_nonblank ();
1115 
1116         read_text_to_slash:
1117           if (ch == EOF)
1118             bad_prog (_(EXPECTED_SLASH));
1119 
1120           if (ch == '\\')
1121             ch = inchar ();
2
27.01.2020, 21:53

Стандартной формой команды aв sedявляется

a\
text to be appended

Команды cи iимеют одинаковый формат.

Если должны быть добавлены дополнительные строки, новая строка каждой должна быть экранирована:

a\
text to\
be appended

Стандарт sedне знает, как интерпретировать \nкак новую строку, как это делает GNU sed, поэтому ваша однострочная команда с не -GNU sedбудет записана (вbash)как

sed $'/test/a\\\n\\\nNot a test\\\nJust Playing\n' <<<test

Здесь мы используем $'...', чтобы заставить оболочку заменить каждый \nфактическим символом новой строки и \\на \.

Команда может быть записана следующим образом без функции $'...'вbash:

sed '/test/a\
\
Not a test\
Just Playing
' <<<test

Обе эти команды будут работать и с GNU sed.

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

sed '/test/a\ \
Not a test\
Just Playing' <<<test

или, используя тот факт, что GNU sedзнает \n,

sed '/test/a\\nNot a test\nJust Playing' <<<test
4
27.01.2020, 21:53

Теги

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