2010-07-16 2 views
6

Это очень простая концепция, но я никогда не мог ее четко сформулировать. и я хотел бы попытаться записать его и посмотреть, где я ошибаюсь.Что такое символ новой строки - ' n'

Если мне нужно, как бы определить «символ новой строки». скажем, если я создам новый файл в unix (или windows), тогда файл сохраняет информацию о конце строки, вставив специальный символ в файл, называемый «новый символ строки». Если да, то какова его ценность ascii? Я помню, что в программах на C я проверял символ чтения на значение «\ n». И почему это запутанные 2 символов для представления символа конца строки ..

bash$ cat states 
California 
Massachusetts 
Arizona 

Скажем, я хочу, чтобы вставить одну строку между строками и хотите выход вида: Желаемая выход:

California 

Massachusetts 

Arizona 

bash$sed -e 's/\n/\n\n/g' states does not work. 

Почему я не могу лечить «новый символ линии» здесь, так как я бы рассматривал любого другого персонажа и запускал что-то вроде команды выше. (Я понимаю, что можно сказать, что это вопрос синтаксиса sed, но можно ли объяснить эту интуицию, не допуская этого, чтобы я мог избавиться от своей путаницы.

Аналогично, внутри редактора vim, Я не могу использовать:.?% s/\ п/\ п \ п/г Почему так

мне нужно дальше бежать \ п с помощью обратной косой черты в СЕПГ и внутри Vim ?. у

Спасибо ,

Jagrati

+3

* И почему это запутанные 2 символов для представления символа конца строки. * - В программе, это не на самом деле два символа - это один символ, который «сбежал» с обратной косой черты. Компилятор понимает, что он представляет другое значение из обычного ASCII ** 'n' **. Экраны символов обычно используются на многих языках и платформах для представления символов, которые вы иначе не могли бы представлять. – GalacticCowboy

+2

Разрабатывая то, что сказал Галактический Ковбой, '\ n' не является символом новой строки, это символ, который * представляет * символ новой строки в символах C и строковых литералах (и в некоторых других контекстах). Фактический реальный символ новой строки в исходном коде, конечно, был бы невидим, за исключением того, что он закончил бы линию. Вот почему у вас проблема с sed: '\ n' не представляет символ новой строки в этой программе. –

+2

Клянусь, я читал «Что такое персонаж новичка -« \ n », поэтому устал – Enriquev

ответ

10

Из sed man page:

Обычно СЭД циклически копирует строку ввода, не включая его прекращения символ новой строки, в шаблон пространства (если есть что-то осталось после того, как функция «D»), применяет все команды с адресами, которые выбирают это пространство шаблонов, копирует пространство шаблонов в стандартный вывод, добавляет новую строку и удаляет пространство шаблонов.

Он работает на линии без присутствия новой строки, поэтому шаблон, который у вас там, не может совпадать. Вам нужно сделать что-то еще - например, матч против $ (конец строки) или ^ (начало строки).

Вот пример того, что работал для меня:

$ cat > states 
California 
Massachusetts 
Arizona 
$ sed -e 's/$/\ 
> /' states 
California 

Massachusetts 

Arizona 

Я типизированных буквального символ новой строки после \ в sed линии.

+0

'\ n' * * * работает в' sed', поэтому вы также можете использовать только 'sed 's/$/\ n /' states' – jabirali

+1

+1 для упоминания пробелов в шаблонах btw :-) – jabirali

+0

@Jabir , а не на моей машине. –

11

строки (\ п) 10 (0xA) и CarriageReturn (\ r) равно 13 (0xD).

Различные операционные системы выбрали различные представления конца строк для файлов. Windows использует CRLF (\ r \ n). В Unix используется LF (\ n). В старых версиях Mac OS используется CR (\ r), но OS X переключается на символ Unix.

Здесь относительно полезно FAQ.

+10

OS 9 использует' \ r'; они сбросили его в OS X и переключились на соответствующий Unix –

+4

+1 @Michael, OS X, конечно, не использует '\ r'. –

+0

Справа, исправлено это. Знаете, я тоже могу отредактировать ответы. :) –

3
sed 's/$/\n/' states 
+0

В файле, закодированном с charset us-ascii, это неверно. Вы должны получить код ASCII. – ssoto

5

экранирующих символов зависят от любой системы их интерпретации. \n интерпретируется как символ новой строки многими языками программирования, но это не всегда верно для других упомянутых вами утилит. Даже если они рассматривают \n как новую линию, могут быть некоторые другие методы, чтобы заставить их вести себя так, как вы хотите. Вам придется проконсультироваться со своей документацией (или посмотреть другие ответы здесь).

Для систем DOS/Windows новая линия фактически представляет собой два символа: Возврат каретки (ASCII 13, AKA \r), а затем Line Feed (ASCII 10). В Unix-системах (включая Mac OSX) это всего лишь Line Feed. На старших Маках это было единственное Возвращение Каретки.

1

Я думаю this сообщение от Jeff Attwood наилучшим образом отвечает на ваш вопрос. Это проведет вас через различия между новыми строками в Dos, Mac и Unix, а затем объясняет историю CR (возврат каретки) и LF (Line feed).

+0

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

1

sed можно поместить в многострочный поиск & заменить режим для соответствия символам новой строки \n.

Для этого sed сначала должен прочитать весь файл или строку в буфер хранения («удержание пространства»), чтобы затем он мог обрабатывать содержимое файла или строки как одну строку в «пространстве шаблона».

Для замены одной новой строки портативно (относительно GNU и FreeBSD sed) вы можете использовать экранированную «настоящую» новую строку.

# cf. http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/ 
echo 'California 
Massachusetts 
Arizona' | 
sed -n -e ' 
# if the first line copy the pattern to the hold buffer 
1h 
# if not the first line then append the pattern to the hold buffer 
1!H 
# if the last line then ... 
$ { 
# copy from the hold to the pattern buffer 
g 
# double newlines 
s/\n/\ 
\ 
/g 
s/$/\ 
/
p 
}' 

# output 
# California 
# 
# Massachusetts 
# 
# Arizona 
# 

Существует, однако, гораздо удобнее было добиться того же результата:

echo 'California 
Massachusetts 
Arizona' | 
    sed G 
0

Я вижу много SED ответов, но ни для Vim. Справедливости ради следует обратить внимание на то, что лечение vim для персонажей новой строки немного сбивает с толку. Найдите \ n, но замените на \ r. Я рекомендую RTFM: :help pattern в целом и :help NL-used-for-Nul в частности.

Чтобы сделать то, что вы хотите с: заменяющей команды,

:%s/\_$/\r 

хотя я думаю, что большинство людей будут использовать что-то вроде

:g/^/put='' 

для того же эффекта.

Здесь вы можете найти ответ самостоятельно. Запустите файл через xxd, который является частью стандартного дистрибутива vim.

:%!xxd 

Вы

0000000: 4361 6c69 666f 726e 6961 0a4d 6173 7361 California.Massa 
0000010: 6368 7573 6574 7473 0a41 7269 7a6f 6e61 chusetts.Arizona 
0000020: 0a          . 

Это показывает, что 46 шестнадцатеричный код C, 61 является код , и так далее.В частности, 0a (десятичный 10) является кодом для \ n. Только для пинков, попробуйте

:set ff=dos 

перед фильтрацией через xxd. Вы увидите 0d0a (CRLF) в качестве терминатора линии.

:help /\_$ 
:help :g 
:help :put 
:help :! 
:help 23.4 
Смежные вопросы