Как заменить каждое n-е появление шаблона, используя sed ONLY

Вы можете найти «клавиатуру» в черточке Unity и щелкнуть значок «Клавиатура», затем в открывшемся окне перейдите на вкладку «Макеты», и там вы можете выбрать новый макет и установить, какая модель клавиатуры принадлежит вам. По описанию, я думаю, вам нужно изменить свою модель клавиатуры, а не макет.

-1
задан 24 March 2018 в 12:36

6 ответов

разве это не основная функция..

, очевидно, это не так. Но это все еще возможно:

[Ф1]

более читабельным с [Ф4], где мы можем отбросить символы:

[Ф2]

, т. е. [ф5], за которым следует любое число[ф6], после чего либо конец строки, либо другой [ф7], за которым следует любое количество не нажать[F8] и т. д. Все после первого [F9] и запоминается в [ф10].

кстати, если Perl доступен, вы можете использовать:

[Ф3]

[ф11] является оператором деления. $I увеличивается с каждым матчем, отрицание modulo является 1, 0, 0, 0, 0, 1, и т. д., который используется в качестве индекса в @выбирает правильный [ф12] или [от f13].

4
ответ дан 8 June 2018 в 15:18
  • 1
    Вау! Это удивительно. – muclux 24 March 2018 в 14:06
  • 2
    Вау потрясающе!!!! да, у нас есть Perl, я prolly использовать Perl, потому что это более читабельным!! большое спасибо!!!!! – Harry McKenzie 24 March 2018 в 15:59
  • 3
    Я пытаюсь передать переменную bash вместо жестко закодированной 5. возможно ли это? – Harry McKenzie 24 March 2018 в 16:12
  • 4
    о получил его на работу с Perl -ЧП 'начать { @а = кя(А) } С/А/$A[dе ++$я %'"$аргумент myvar"']/г' – Harry McKenzie 24 March 2018 в 16:15
  • 5
    или вы можете передать параметр: [Ф1] – choroba 24 March 2018 в 16:18
Разве это не основная функция.

Очевидно, что это не так. Но это все еще возможно:

sed 's/a\([^a]*\($\|a[^a]*\($\|a[^a]*\($\|a[^a]*\($\|a\)\)\)\)\)/A\1/g'

Более читаемый с помощью -r, где мы можем отбрасывать обратную косую черту:

sed -r 's/a([^a]*($|a[^a]*($|a[^a]*($|a[^a]*($|a)))))/A\1/g'

i.e. a, за которым следует любое число не a, за которым следует либо конец строки, либо другой a, за которым следует любое количество не a и т. д. Все после первого a запоминается в \1.

BTW, если доступно Perl, вы можете использовать:

perl -pe 'BEGIN { @A = qw(a A) } s/a/$A[not $i++ % 5]/g'

% - это оператор modulo. $ i увеличивается с каждым соответствием, отрицание по модулю равно 1, 0, 0, 0, 0, 1 и т. д., которое используется как индекс в @A, выбирает правильные a или A.

4
ответ дан 17 July 2018 в 18:12
Разве это не основная функция.

Очевидно, что это не так. Но это все еще возможно:

sed 's/a\([^a]*\($\|a[^a]*\($\|a[^a]*\($\|a[^a]*\($\|a\)\)\)\)\)/A\1/g'

Более читаемый с помощью -r, где мы можем отбрасывать обратную косую черту:

sed -r 's/a([^a]*($|a[^a]*($|a[^a]*($|a[^a]*($|a)))))/A\1/g'

i.e. a, за которым следует любое число не a, за которым следует либо конец строки, либо другой a, за которым следует любое количество не a и т. д. Все после первого a запоминается в \1.

BTW, если доступно Perl, вы можете использовать:

perl -pe 'BEGIN { @A = qw(a A) } s/a/$A[not $i++ % 5]/g'

% - это оператор modulo. $ i увеличивается с каждым соответствием, отрицание по модулю равно 1, 0, 0, 0, 0, 1 и т. д., которое используется как индекс в @A, выбирает правильные a или A.

4
ответ дан 23 July 2018 в 19:01

Простой sed и расширение скобки:

sed '-es/pattern/replace/'{max..min..step} infile

заменить max числом> = числом вхождений шаблона, если вы этого не знаете, установите его как наибольшее число символов в самой длинной строке в вашем файле.

$ sed '-es/a/A/'{20..1..5} <<<"aaaa aaaa   a a a aa a a a aa aa"
aaaa Aaaa   a A a aa a A a aa aA

Чтобы заменить первое появление, используйте ниже:

$ sed '-es/a/A/'{{20..1..5},1} <<<"aaaa aaaa   a a a aa a a a aa aa"
Aaaa Aaaa   a A a aa a A a aa aA
1
ответ дан 8 June 2018 в 15:18
  • 1
    спасибо! я выбрал решение без необходимости указать максимальную сумму, но я очень ценю свое время и помогаешь мне! – Harry McKenzie 24 March 2018 в 16:01

Простой sed и расширение скобки:

sed '-es/pattern/replace/'{max..min..step} infile

заменить max числом> = числом вхождений шаблона, если вы этого не знаете, установите его как наибольшее число символов в самой длинной строке в вашем файле.

$ sed '-es/a/A/'{20..1..5} <<<"aaaa aaaa a a a aa a a a aa aa" aaaa Aaaa a A a aa a A a aa aA

Чтобы заменить первое появление, используйте ниже:

$ sed '-es/a/A/'{{20..1..5},1} <<<"aaaa aaaa a a a aa a a a aa aa" Aaaa Aaaa a A a aa a A a aa aA
1
ответ дан 17 July 2018 в 18:12

Простой sed и расширение скобки:

sed '-es/pattern/replace/'{max..min..step} infile

заменить max числом> = числом вхождений шаблона, если вы этого не знаете, установите его как наибольшее число символов в самой длинной строке в вашем файле.

$ sed '-es/a/A/'{20..1..5} <<<"aaaa aaaa a a a aa a a a aa aa" aaaa Aaaa a A a aa a A a aa aA

Чтобы заменить первое появление, используйте ниже:

$ sed '-es/a/A/'{{20..1..5},1} <<<"aaaa aaaa a a a aa a a a aa aa" Aaaa Aaaa a A a aa a A a aa aA
1
ответ дан 23 July 2018 в 19:01
  • 1
    Спасибо! я выбрал решение без необходимости указывать максимальную сумму, но я действительно ценю ваше время и помогаю мне! – Harry McKenzie 24 March 2018 в 16:01

Другие вопросы по тегам:

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