2015-04-01 3 views
0

Я хотел бы удалить все текстовые файлы "\n" (цитаты, новые строки, цитаты).Удалить все « n» вхождения с sed

Я пробовал: sed 's/"\n"//g' <in> out а также sed '/"\n"/d' <in> out, но не из тех SEDs работал.

Может кто-нибудь сказать мне, что я делаю неправильно?

+0

Возможный дубликат [Как заменить новую строку (\ n) с помощью sed?] (Http://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using- sed) – NeronLeVelu

+0

вы, вероятно, хотите unix2dos, см. http://stackoverflow.com/a/6373961/297323 –

+0

Вы имеете в виду «в конце строки, буквальной новой строки и буквы» в начале следующей строки или вы имеете в виду эти четыре символа буквально? –

ответ

1

Это работает с GNU sed в Linux: у меня нет Mac для тестирования.

sed ' 
    # this reads the whole file into pattern space 
    :a; N; $ bb; ba; :b 
    # *now* make the replacement 
    s/"\n"//g 
' <<END 
one 
two" 
"three 
four" 
five 
"six 
END 
one 
twothree 
four" 
five 
"six 

Эта команда Perl выполняет то же самое:

perl -0777 -pe 's/"\n"//g' 
+1

Работа perl, sed не сделал. Спасибо в любом случае – user3840048

+0

Для тех, кто не знаком с Perl: 'perl -0777' - это идиома для чтения входного файла _as a whole_ (все строки сразу). – mklement0

+0

+ для решения Perl и _principle_ решения 'sed', которое, однако, как отмечено, не работает над OSX; для варианта, который _does_ работает в OSX, см. [мой ответ] (http://stackoverflow.com/a/29404564/45375). – mklement0

0

Попробуйте это - вам нужно избежать обратной косой черты, чтобы сделать ее буквальной.

sed 's/"\\n"//g' <in> out 

Проверено на OSX.

+0

Не работает, попробовал также с '\ r' – user3840048

+0

Он работает здесь. Какая у вас раковина? –

+2

sed ориентирован по умолчанию, поэтому, если вы не используете N или H, в пространстве шаблона/удержания не будет новых строк. –

-1

вместо СЭД можно также использовать Tr, я проверил это и для меня он работал

tr -d '"\\n"' <input.txt> output.txt 
+0

Это удаляет все кавычки в файле – user3840048

+0

и все новые строки –

+0

все новые строки удаляются, если вы забудете избежать обратной косой черты –

0

Это AWK-Oneliner здесь работает, вы можете дать ему попробовать:

awk -F'"\n"' -v RS='\0' -v ORS="" '{$1=$1;print}' file 

небольшой тест: тестирование с простака

kent$ cat f 
foo" 
"bar" 
"bla" 
new line should be kept 
this too 

kent$ awk -F'"\n"' -v RS='\0' -v ORS="" '{$1=$1;print}' f 
foo bar bla" 
new line should be kept 
this too 

Если вы не хотите, чтобы пространство между foo и barblah .., add -v OFS="" to awk

+0

Это также изменило 'foo" \ nbar' на 'foo" bar' – user3840048

+0

@ user3840048 нет, этого не будет, по крайней мере, здесь этого не будет. ;) Вы пробовали с gawk? – Kent

0

accepted answer была помечена как таковой из-за Perl команды он содержит.

Команда sed фактически не работает на OSX, поскольку он использует возможности, специфичные для GNUsed, в то время как OSX использовать BSDsed.

эквивалент ответ требует лишь несколько ухищрений - обратите внимание, что это будет работать с как BSD и GNU sed:

Использование Множественные -e варианты:

sed -e ':a' -e '$!{N;ba' -e '}; s/"\n"//g' <in> out 

Или , используя ANSI C-quoted string в Bash:

sed $':a\n$!{N;ba\n}; s/"\\n"//g' <in> out 

Или, используя многострочного строку буквального:

sed ':a 
    $!{N;ba 
    }; s/"\n"//g' <in> out 

BSD sed требует этикеток (например, :a) и ветвление команд (например, b) должен быть прекращен с актуальной новостной линией (тогда как в GNU достаточно ;), или, альтернативно, для сценария, который должен быть b roken в несколько опций -e, причем каждая часть заканчивается, когда требуется новая строка.
Более подробное обсуждение различий между GNU и BSD sed см https://stackoverflow.com/a/24276470/45375

$':a\n$!{N;ba\n}' является общим sed идиомы для чтения всех входных строк в так называемом шаблоне (буфер, на котором (последующие) команды работают):

  • :a представляет собой метку, которая может быть разветвленной, чтобы
  • $! матчей каждая строка но л AST
    • {N;ba\n} продолжает строить буфер, добавив текущую строку (N) к нему, а затем обратно ветвления для обозначения :a повторить цикл.
  • После последней линии достигнута, не ветвящийся не выполняются, и буфер в этой точке содержит всех входных линии, после чего желаемого замещения (s/"\n"//g) осуществляются на весь буфере.

Что касается почему подход OP не работал:

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

Для того, чтобы подменять новыми символами. - т. е., для работы через несколько строк - вы должны явно прочитать несколько/все строки сначала, как указано выше.

Смежные вопросы