Как заменить часть строки до третьего вхождения разделителя?

Вы не можете переключать интерпретаторы, но вы можете создать новый процесс оболочки, а затем вернуться к perl:

my $sh_code = <<'END_SH'
for f in *.mrc; do mv -- "$f" "${f%%.*}".mrc ; done
END_SH

system 'bash', '-c', $sh_code

Или вы можете заменить текущий процесс perl оболочкой

exec 'bash', '-c', $sh_code

Но, как отвечает @choroba, perl — это язык общего назначения, и он может справиться практически с любой задачей.

0
02.12.2019, 16:40
3 ответа

При использовании GNU sedи расширенных регулярных выражений(-r)следующее должно работать:

sed -r "s/^([^:]*:){3}/FFF:/"

как в sed <...> filename.txtилиecho "$original_string" | sed <...>

Это заменит подстроку, которая, начиная с начала строки (^), содержит три раза подряд шаблон, состоящий из «любого, кроме двоеточия ([^:])», за которым следует двоеточие, на шаблон FFF:.

1
28.01.2020, 05:04
Sol1:

praveen@praveen:~/template$ sed "s/AAA: BBB: CCC:/FFF:/g" p.txr
FFF: DDD: EEE

praveen@praveen:~/template$ awk '{gsub("AAA: BBB: CCC:","FFF:",$0);print $0}' p.txr
FFF: DDD: EEE

sol2 using python


k=open('p.txr','r')
>>> m=re.compile(r'AAA: BBB: CCC:')

>>> import re
>>> m=re.compile(r'AAA: BBB: CCC:')
>>> for i in k:
...     print re.sub(m,"FFF:",i)
... 
FFF: DDD: EEE
-2
28.01.2020, 05:04

Ты можешь использовать это:

$ sed -e 's/:/\n/3;s/.*\n/FFF:/' file

Здесь мы используем функцию, обнаруженную в sed, для осуществления n -го изменения, n<=512. Кроме того, новая строка гарантированно не будет видна в пространстве шаблона, если только она не была введена априори с помощью G, H, N или добавлена ​​буквальная новая строка, как в нашем случае.

Это гнусед -изм. Мы используем экранированный литерал новой строки для Posix sed.

0
28.01.2020, 05:04

Теги

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