2010-02-18 2 views
1

Как заменить первые 150 символов каждой строки пробелами с помощью sed. Я не хочу выводить большие пушки (Python, Perl и т. Д.), И кажется, что sed очень мощный сам по себе (некоторые из них, например, написали калькулятор dc). Связанная с этим проблема заключается в том, что перед каждой строкой вставлено 150 пробелов.N-Insert In Sed

s/^.\{50\}/?????/ 

Что соответствует первым 50 символам, но что тогда? Я не могу сделать OUTPUT

s/^.\{50\}/ \{50\}/ 

Можно использовать Readline для имитации 150 прессов (альт + 150), но это хромой.

ответ

2

В основном вы хотите сделать это:

sed -r "s/^.{150}/$(giveme150spaces)/" 

Вопрос лишь в том, что это самый элегантный способ получить 150 программно пространства. Здесь обсуждаются различные методы: Bash Hacker's Wiki. Проще всего использовать printf '%150s', как это:

sed -r "s/^.{150}/$(printf '%150s')/" 
+0

Может ли решение printf применяться к запросу OP для решения с помощью sed? –

+0

отредактировано, чтобы быть более ясным – dubiousjim

2

Используйте трюма.

/^.\{150\}/ {;# simply echo lines shorter than 150 chars 
    h;# make a backup 
    s/^.\{150\}\(.*\)/\1/;# strip 150 characters 
    x;# swap backup in and remainder out 
    s/^\(.\{150\}\).*/\1/;# only keep 150 characters 
    s/./ /g;# replace every character with a space 
    G;# append newline + remainder to spaces 
    s/\n//;# strip pesky newline 
}; 

В качестве альтернативы, вы можете закодировать петлю (несколько короче код):

s/^.\{150\}/x/;# strip 150 characters & mark beginning of line 
t l 
# if first substitution matched, then loop 
d; # else abort and go to next input line 
:l 
# begin loop 
s/^/ /;# insert a space 
/^ \{150\}x/!t l 
# if line doesn't begin with 150 spaces, loop 
s/x//;# strip beginning marker 

Однако, я не думаю, что вы можете использовать цикл без sed -f, или найти какой-то другой способ избежать новой строки , Имена ярлыков, похоже, запускаются до конца строки, прямо через ;.

+0

больше работы, но больше удовлетворения. +1 – dubiousjim

+0

Thaat is pro :) –

+0

Как и выше, с некоторыми исправлениями: 'sed -n '/^.\{150\}/ {h; с/^ \ {150 \} \/\ 1 /. (* \.); Икс; с/^ \ */\ 1/(\ {150 \} \.). s /./ /г; Г; s/\ п //; p} ''Оригинал печатает две части строки на отдельных строках (другими словами, добавляет дополнительную строку новой строки, отсутствует обратная косая черта в первом наборе фигурных скобок и не включает в себя необходимый« -n ». +1 в любом случае, однако, –

1

Логика состоит в том, чтобы перебирать файл, распечатывать 150 пробелов, а затем печатать остальную часть строки от 151 до конца, используя «подстроку». например, для первых 10 символов.

$ more file 
1234567890abc 
0987654321def 
$ awk '{printf "%10s%s\n", " ",substr($0,11)}' file 
      abc 
      def 

Это намного проще, чем при разработке регулярных выражений.

Bash:

while read -r line 
do 
    printf "%10s%s\n" " " "${line:10}" 
done <"file" 
1

Это может работать для вас:

sed ':a;/^ \{150\}/!{s/[^ ]/ /;ta}' file 

Это заменит первые 150 символов строки с пробелами. Однако, если линия короче 150, она заменяет все пробелы, но сохраняет исходную длину.

Это решение заменяет первые 150 знаков с пробелами или увеличивает линию до 150 пространств долго:

sed ':a;/^ \{150\}/!{s/[^ ]/ /;ta;s/^/ /;ba}' file 

И это заменяет первые 150 символов строки с пробелами, но оставляет линия короче нетронутая:

sed '/.\{150\}/!b:a;/^ \{150\}/!{s/[^ ]/ /;ta}' file