Как добавить начало каждой строки перед шаблоном в конец каждой строки? - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь скопировать начало каждой строки в текстовом файле перед определенным символом до конца той же строки.

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

Я пробовал что-то вроде

sed '/S/ s/$/ append text/' sample.txt > cleaned.txt

, но это только добавляет фиксированный текст. Я также пытался использовать:

s/\(.*\)/\1 \1/

для дублирования строки, а затем удаляю все после S, но я не могу понять, как заставить его перейти к 3-му Sне первый, чтобы начать удаление.

С чего мне начать:

dog 50_50_S5_Scale
cat 10_RV_S76_Scale
mouse 15_SQ_S81_Scale

Что я пытаюсь получить:

dog 50_50_S5_Scale dog 50_50_
cat 10_RV_17_S76_Scale cat 10_RV_17_
mouse 15_EQ_S81_Scale mouse 15_EQ_

Где все допервый S копируется в конец строки.

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Вы можете использовать

sed 's/\([^S]*\)S.*/& \1/' file

См. онлайн-демонстрацию

Подробнее

  • \([^S]*\)- Группа захвата 1 (\1): любые 0+ символов кроме S
  • S.* - S и остальная часть строки (фактически строка, так как sed обрабатывает строкустрока по умолчанию).

Замена - это объединение всего совпадения (&), пробела и значения группы 1.

0 голосов
/ 02 октября 2019

Вы можете попробовать:

awk '{print $0 " " substr($0, 0, index($0,"S") - 1)}' file

Мы берем подстроку от первого символа до, но не включая первое вхождение "S".

...