заменить текст в соответствии с номером строки и диапазоном столбцов - PullRequest
0 голосов
/ 10 ноября 2019

В текстовом файле foo.txt:

Lorem ipsum dolor sit amet
sed quam rutrum, interdum sodales ex
pellentesque urna placerat

Я хочу заменить текст в строке 2 с столбец 10 на 16 другой строкой "fermentum", что приводит к:

Lorem ipsum dolor sit amet
sed quam fermentum, interdum sodales ex
pellentesque urna placerat

Точность: регулярное выражение НЕТ, чтобы поймать rutrum нужны позиции индекса

Ответы [ 3 ]

2 голосов
/ 10 ноября 2019

Это способ использования sed для подстановки текста точно в строке 2, начиная со столбца 10 (включительно) до 16 (исключительно).

sed -E '2s/^(.{9})(.{5})(.*)$/\1fermentum\3/' foo.txt > bar.txt

-E используется для избежания экранирования скобок и тому подобного ...

2 означает - точно во второй строке

s означает substitute

^ - начало строки

(.{9}) захватывает 9 любых отдельных символов (* в этом случае 'sed quam ')

(.{5}) захватывает следующее5 символов ('rutrum')

(.*) фиксирует ноль или более оставшихся символов (', interdum sodales ex')

$ - конец строки

\1 -ссылка на первый захваченный текст

\3 - ссылка на третий захваченный текст

> bar.txt отвечает за сохранение результата в bar.txt

Более подробная информация можетможно найти здесь .

1 голос
/ 10 ноября 2019

Это действительно довольно просто в awk, используя sub. У вас есть фундаментальное недопонимание того, как работает awk. (кроме как с расширением GNU awk FIELDWIDTHS), awk не действует на символы, оно действует на поля , обозначенные как FS (разделитель полей, по умолчанию - пробел),Таким образом, для работы на "rutrum," вы хотели бы работать с полем 3 rd в записи 2 nd . Вы можете идентифицировать вторую строку, используя FNR == 2 (номер записи файла) или NR для (номера записи) всех обрабатываемых файлов.

Решение awk для вашего случая будет:

awk 'FNR == 2 {sub(/^rutrum/,"fermentum",$3)}1' file

Где sub(/find_regex/,"replace"[,target]) обозначает опциональную цель как поле 3 rd .

Пример использования / Вывод

С исходным текстом в file вы получите:

$ awk 'FNR == 2 {sub(/^rutrum/,"fermentum",$3)}1' file
Lorem ipsum dolor sit amet
sed quam fermentum, interdum sodales ex
pellentesque urna placerat

Редактировать - использовать только номера строк и столбцов

Если вы не можете использоватьрегулярные выражения и могут использовать только номер строки и номер столбца, тогда вы все еще можете использовать awk с substr и конкатенацию строк. По сути, вы просто построите строку 2 и из первых 9 символов строки плюс "fermentum" плюс 16 символов, например,

awk 'FNR == 2 {s=substr($0,1,9); s=s "fermentum"; s=s substr($0,16); $0=s}1' file

над каждой из трех частейобъединяются в строку s, а затем строка 2 nd устанавливается равной новой объединенной строке. (вывод такой же, как указано выше)

1 голос
/ 10 ноября 2019
[C]$ cat foo.txt | ./line2-col10_16.sed
Lorem ipsum dolor sit amet
sed quam fermentum, interdum sodales ex
pellentesque urna placerat

[C]$ cat foo.txt | ./line2-col10_16.sed > new 
[C]$ diff foo.txt new 
2c2
< sed quam rutrum, interdum sodales ex
---
> sed quam fermentum, interdum sodales ex
[C]$ cat line2-col10_16.sed 
#! /bin/sed -f
#
# cat foo.txt | ./line2-col10_16.sed
#
# foo.txt:
# Lorem ipsum dolor sit amet
# sed quam rutrum, interdum sodales ex
# pellentesque urna placerat
#
# I want to replace text on line 2 from column 10 to 16 with another string "fermentum", resulting in:
#
# Lorem ipsum dolor sit amet
# sed quam fermentum, interdum sodales ex
# pellentesque urna placerat
#
# sed
#
# line 2
# substitue 
# LHS match 3 groups
# \1: any char 9 times
# \2: any char 6 times
# \3: everything else
# RHS replace with
# group 1 + "fermentum" + group 3
2 s/^\(.\{9\}\)\(.\{6\}\)\(.*\)/\1fermentum\3/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...