Добавьте пробелы после подстроки, сохраняя столбцы - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть файл данных, подобный этому:

randomthingsbefore $DATAROOT/randompathwithoutanypattern randomthingsafter
randomthingsbefore $DATAROOT/randompathwithoutanypattern randomthingsafter $DATAROOT/randompathwithoutanypattern randomthingsafter
randomthingsbefore $DATAROOT/randompathwithoutanypattern randomthingsafter
(...)

Я хочу удалить подстроку $ DATAROOT из каждого пути и добавить пробелы после пути для сохранения столбцов, где случайных вещей после началось.Обратите внимание, что в одной строке может быть 2 или более путей с подстрокой $ DATAROOT .Таким образом, мой желаемый результат будет выглядеть так:

randomthingsbefore /randompathwithoutanypattern          randomthingsafter
randomthingsbefore /randompathwithoutanypattern          randomthingsafter /randompathwithoutanypattern          randomthingsafter
randomthingsbefore /randompathwithoutanypattern          randomthingsafter
(...)

Я пробовал:

VAR1=*pathtofile*

VAR2=$(\grep -oP '\$DATAROOT\K[^ ]*' $VAR1)
arr=$(echo $VAR2 | tr " " "\n")  

 for x in $arr
 do
   y="${x}          "
   sed -i "s:$x:$y:" $VAR1
 done

sed -i 's/$DATAROOT\///g' $VAR1

, но, похоже, он не работает.Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 25 сентября 2018

Я считаю, что проще всего просто использовать для замены вашего скрипта одной строкой:

sed 's/$DATAROOT\([^[:blank:]]*\)/\1         /g' /path/to/file

Обратите внимание, что это 9 пробелов после \1, что является длинойстроки $DATAROOT.Здесь мы используем то, что известно как обратная ссылка :

Редактирование команд в sed

[2addr]s/BRE/replacement/flags: заменитьстрока замены для экземпляров BRE в пространстве шаблонов.Любой символ, отличный от или , может использоваться вместо для разделения BRE и замены.Внутри BRE и замены сам разделитель BRE может использоваться в качестве литерального символа, если ему предшествует .

Строка замены должна сканироваться от начала до конца.Символ (&), появляющийся при замене, должен быть заменен строкой, соответствующей BRE.Особое значение & в этом контексте может быть подавлено предшествующим ему .Символы \n, где n - это цифра, должны быть заменены текстом, соответствующим соответствующему выражению обратной ссылки.Если соответствующее выражение обратной ссылки не совпадает, то символы \n должны быть заменены пустой строкой.Особое значение \n, где n - это цифра в этом контексте, может быть исключено, если перед ним стоит .Для каждого встречающегося следующий символ теряет свое особое значение (если оно есть).

источник: POSIX SED

9.3.6 BRE, совпадающих с несколькими символами

Выражение обратной ссылки \n должно совпадать с той же (возможно, пустой) строкой символов, которая соответствовала подвыражению, заключенному между \( и \), предшествующими \n.Символ n должен быть цифрой от 1 до 9, указывающей n th подвыражение (то, которое начинается с n \( в начале шаблона и заканчивается соответствующей парной \))Выражение недопустимо, если перед \n стоит меньше n подвыражений.Строка, соответствующая содержащемуся подвыражению, должна находиться в пределах строки, соответствующей содержащемуся подвыражению.Если содержащее подвыражение не совпадает или если нет совпадения для содержащегося подвыражения в строке, совпадающей с содержащим подвыражением, то выражения обратной ссылки, соответствующие содержащемуся подвыражению, не должны совпадать.Когда подвыражение соответствует более чем одной строке, выражение обратной ссылки, соответствующее подвыражению, должно ссылаться на последнюю найденную строку.Например, выражение ^\(.*\)\1$ соответствует строкам, состоящим из двух соседних появлений одной и той же подстроки, а выражение \(a\)*\1 не соответствует a, выражение \(a\(b\)*\)*\2 не соответствует abab, а выражение ^\(ab*\)*\1$ соответствует ababbabb, но не соответствует ababbab.

источник: Основные регулярные выражения POSIX

...