sed / awk для двойного пробела - PullRequest
5 голосов
/ 01 июля 2011

У меня есть файл с пустыми строками, и мне нужно удвоить пробел в файле. То есть мне нужна пустая строка между двумя строками с текстом. Можете ли вы показать мне простой способ сделать это с помощью awk и / или sed

Ответы [ 10 ]

10 голосов
/ 01 июля 2011

Попробуйте это

sed '/^$/d' fileName | sed G
7 голосов
/ 12 ноября 2011

с использованием sed

$ sed G input.txt | cat -s
4 голосов
/ 27 ноября 2011

Предполагая, что:

1. Вы хотите сделать это всего за SED
2. Вы хотите сделать все это за один проход
3. Некоторые из ваших «пустых» строк могут содержать вкладки | пробелы
4. Текущий интервал неравномерен (0, 1 или более пробелов после каждой строки)
5. Вы хотите получить одинаковый двойной интервал

Попробуйте это:

#!/bin/sed -f
/^[ \t]*$/d
/^..*$/a\

Первая строка гласит: Если вы видите «пустую строку», удалите ее.
Вторая строка гласит: Если вы видите непустую строку, добавьте строку после нее.

0 голосов
/ 27 сентября 2018

Очень быстрый способ использования

sed '/^$/d;G'

При этом удаляются все пустые строки с помощью команды /^$/d и добавляется содержимое области удержания (которая пуста) кпробел с новой строкой между (G).

Очень быстрый способ использования

awk 'BEGIN{RS="";FS="\n";ORS=OFS="\n\n"}{$1=$1}1'

Как это работает:

знает записи концепта (которые по умолчанию являются строками), и вы можете определить запись по ее разделителю записей RS.Если вы установите значение RS для пустой строки, оно будет соответствовать любому множеству пустых строк в качестве разделителя записей.Значение ORS является разделителем выходных записей.В нем указывается, какой разделитель должен быть напечатан между двумя последовательными записями.Это установлено на два символа.Это, однако, не решает проблему, когда у вас есть многострочная запись.Поэтому для этого мы определяем поля (по умолчанию слова).Разделитель полей FS определяется как один символ , так что каждое поле представляет собой строку.А выходной разделитель полей определяется как два символа.Мы преобразуем FS в OFS, переназначая первое поле себе {$1=$1} Наконец, оператор 1 является сокращением для {print $0}, который печатает текущую запись, за которой следует выходной разделитель записей ORS.

0 голосов
/ 06 января 2016

с awk:

 # double space a file
 $ awk '1;{print ""}' file

Другой способ

 # or like this
 $ awk 'BEGIN{ORS="\n\n"};1' file

Awk однострочные

0 голосов
/ 26 сентября 2012
sed -n 's/.*/&\n/p'

& и \n должны работать, я думаю

0 голосов
/ 28 ноября 2011

Предполагая, что:

1. Вы хотите сделать это всего за AWK
2. Вы хотите сделать все это за один проход
3. Некоторые из ваших «пустых» строк могут содержать вкладки | пробелы
4. Текущий интервал неравномерен (0, 1 или более пробелов после каждой строки)
5. Вы хотите получить одинаковый двойной интервал

Попробуйте это:

awk '$0 !~ /^[ \t]*$/ { print $0, "\n" }' <file>

Разбивая это,

Часть перед фигурной скобкой гласит: сопоставлять только непустые строки
Часть в фигурных скобках гласит: Распечатайте эту строку и добавьте еще одну (пустую)

0 голосов
/ 01 июля 2011

Предполагая, что вы хотите сохранить существующие пустые строки нетронутыми:

awk '
    prev && $0 {print ""}
    {print; prev = $0}
'

Первый тест будет верным, только если предыдущая и текущая строки не пустые.

0 голосов
/ 01 июля 2011

Попробуйте это

awk '{print $0 "\n"}' fileName
0 голосов
/ 01 июля 2011
jcomeau@intrepid:/tmp$ cat test.txt
test
tset 2
test 3
test 4
jcomeau@intrepid:/tmp$ sed 's/\(.*\)/\1\n/' test.txt
test

tset 2

test 3

test 4

Саи sed G test.txt также работает, но я понятия не имею, как.

...