N-Вставка в Sed - PullRequest
       21

N-Вставка в Sed

1 голос
/ 18 февраля 2010

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 19 февраля 2010

Используйте место для удержания.

/^.\{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 или найти какой-либо другой способ избежать перевода строки. Названия меток, кажется, идут до конца строки, прямо через ;.

2 голосов
/ 18 февраля 2010

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

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

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

sed -r "s/^.{150}/$(printf '%150s')/"
1 голос
/ 25 января 2012

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

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
1 голос
/ 19 февраля 2010

Логика состоит в том, чтобы перебрать файл, вывести 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"
...