как использовать sed для замены совпавшего со списком - PullRequest
0 голосов
/ 23 октября 2018

Я хочу заменить текстовые файлы, используя sed, но с последовательностью.

example.txt :

1. 2000000
2. 2000000
3. 2000000
4. 2000000

Я хочу получить такой результат, как:

1. 2000000
2. 1900000
3. 1800000
4. 1700000

У меня есть такой грязный способ:

for i in {2000000..1700000..-100000}; do sed -i -e "0,/2000000/! {0,/2000000/ s/2000000/$i/}" example.txt; done

Есть идеи получше?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Если вы хотите заменить второе поле числом, которое уменьшается на 10000 от значения в первой строке, попробуйте

awk 'NR == 1 { value = $2 }
    NR > 1 { value -= 10000; $2 = value }
    1' file >newfile

В некоторых вариантах Awk есть опция --inplace или аналогичная, которая позволяетзаписать результаты обратно во входной файл напрямую.

Рефакторинг этого сценария в sed довольно бессмысленный и умозрительный, но если вы знаете верхние границы того, сколько строк вы ожидаете в файле, выможет сгенерировать сценарий sed, такой как

2s/[1-9][0-9]*$/1900000/
3s/[1-9][0-9]*$/1800000/
4s/[1-9][0-9]*$/1700000/
:

, для столько строк, сколько необходимо, а затем просто запустить sed один раз с этим сценарием в качестве входных данных.Если вы работаете в Linux, вы сможете передать скрипт в стандартный ввод sed:

for ((i=1900000, j=2; i>0; i-= 10000, j++)); do
    printf '%is/[1-9][0-9]*$/%i\n' "$j" "$i"
done |
sed -i -f - example.txt
0 голосов
/ 23 октября 2018

Использование awk может быть проще:

awk '{sub("2000000",2000000-(100000*c++))}1' file

Счетчик c не определен для первой строки, поэтому число не меняется.На следующей строке счетчик увеличивается, а значение уменьшается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...