sed вставка :сохранить начальные пробелы из вставленной строки

Попытка сделать это с помощью awk:

count.awk:

#!/usr/bin/awk -f
# count line containing word

{
    for (i = 1 ; i <= NF ; i++) {
        word_in_a_line[$i] ++
        if (word_in_a_line[$i] == 1) {
            word_line_count[$i] ++
        }
    }

    delete word_in_a_line
}

END {
    for (word in word_line_count){
        printf "%s:%d\n",word,word_line_count[word]
    }
}

Запустите его:

$ awk -f count.awk./test.data | sort
1
06.03.2021, 09:46
3 ответа

Чтобы сохранить начальные пробелы при вставке переменной, вам просто нужно экранировать один раз пробелы с обратной косой чертой \после команды вставить i, например:

$ sed '50i\'"$add" file
    public function add($hardware_id = null)

  1. Не относится к переменным, было бы то же самое, если бы текст был вставлен буквально.

  2. Это не указанное в POSIX поведение, которое предписывает экранированный литерал новой строки перед вставляемым текстом.

1
18.03.2021, 22:27

Самый простой способ добиться этого — использовать синтаксис i\. Но поскольку мы находимся под зонтиком двойных кавычек, мы избегаем обратной косой черты. И переменная должна быть безопасной для этой операции путем экранирования новой строки (s )и обратной косой черты (s)

add='     public function add($hardware_id \= null
)'

#------------------------------
# make variable safe to use
# by escaping backslash n newline

esc_add=$(printf '%s\n' "$add" |
sed -e 's:\\:&&:g;$!s:$:\\:g')

sed -e "
  5i\\
$esc_add
" file | nl
     1  ABC
     2        2   3   4:blockA-1
     3        7   9   4:blockA-2
     4        1   2   5:blockA-3/
     5       public function add($hardware_id \= null
     6  )
     7  ABC
     8       13  11   17:blockB-1
     9       2   1    1:blockB-2/
    10  ABC
    11       7   9    14:blockC-1
    12       5   8    2:BlockC-2
    13       9   9    9:BlockC-3
    14       7   1    2:BlockC-4$
2
18.03.2021, 22:27

Сделайте себе одолжение и используйте perlили awkвместо sedздесь, чтобы сделать это:

add=$'  anything including \\backslash\\
and newline and even non\x80-text or overlong lines '

ADD=$add perl -pe '$_ = "$ENV{ADD}\n$_" if $. == 5' < "$file"

Или (, хотя это может привести к сбою из-за слишком длинных строк или байтов NUL в содержимом, и будьте осторожны, он добавит завершающую новую строку, если ее изначально не было):

ADD=$add LC_ALL=C awk 'NR == 5 {$0 = ENVIRON["ADD"] ORS $0}; 1' < "$file"
2
18.03.2021, 22:27

Теги

Похожие вопросы