2016-10-07 2 views
1

У меня есть файл с записями нижеSED несколько замен с диапазоном линии

user1,fuser1,luser1,[email protected],data,user1 
user2,fuser2,luser2,[email protected],data,user2 
user3,fuser3,luser3,[email protected],data,user3 

Я хотел, чтобы выполнить некоторые текстовые замены из

user1, fuser1, luser1, user1 @ test.com, данные, user1

в

New_user1, New_fuser1, New_luser1, New_user1 @ test.com, данные, New_user1

поэтому я написал ниже сценарий sed.

sed -i -e 's/user/New_user/g; s/fuser/New_fuser/g; s/luser/New_luser/g' file 

Это работает отлично. Теперь у меня есть требование, которое я хочу заменить в определенном диапазоне строк.

start=2 
end=3 
sed -i -e ''${start},${end}'s/user/New_user/g; s/fuser/New_fuser/g; s/luser/New_luser/g' file 

, но эта команда заменяет шаблон во всех строках. Пример вывод,

user1,New_fuser1,New_luser1,[email protected],data,New_user1 
user2,New_fuser2,New_luser2,[email protected],data,New_user2 
user3,New_fuser3,New_luser3,[email protected],data,New_user3 

Похоже, диапазон становится применяется только к первому выражению и остальные выражения становятся применены на весь файл. Как применить этот диапазон ко всем выражениям?

+0

Я не думаю, что скрипт 'sed' _w orks perfect_: 'New_user1, fNew_user1, lNew_user1'. Каков ваш ожидаемый результат с этими входными данными? –

ответ

1

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

awk -vFS="," -vOFS="," -v columnStart=2 -v columnEnd=3 -v rowStart=1 -v rowEnd=2 \ 
    'NR>=rowStart&&NR<=rowEnd{for(i=columnStart; i<=columnEnd; i++) \ 
      $i="New_"$i; print }' file 

где awk переменных columnStart, columnEnd, rowStart и rowStart определить, какие столбцы и строки, чтобы заменить , как де-лимитер принят.

Для вашего входного файла: -

$ cat input-file 
user1,fuser1,luser1,[email protected],data,user1 
user2,fuser2,luser2,[email protected],data,user2 
user3,fuser3,luser3,[email protected],data,user3 

Предполагая, что я хочу сделать замену в строках 2 и 3 из колонок 3-4, я могу установить вверх мой awk в

awk -vFS="," -vOFS="," -v columnStart=3 -v columnEnd=4 -v rowStart=2 -v rowEnd=3 \ 
    'NR>=rowStart&&NR<=rowEnd{for(i=columnStart; i<=columnEnd; i++) \ 
      $i="New_"$i; print }' file 
user2,fuser2,New_luser2,[email protected],data,user2 
user3,fuser3,New_luser3,[email protected],data,user3 

Для примените, скажем, последний столбец, установите columnStart и columnEnd на такое же значение, например скажем, на колонке 6 и на последняя линия только.

awk -vFS="," -vOFS="," -v columnStart=6 -v columnEnd=6 -v rowStart=3 -v rowEnd=3 \ 
    'NR>=rowStart&&NR<=rowEnd{for(i=columnStart; i<=columnEnd; i++) \ 
      $i="New_"$i; print }' file 
user3,fuser3,luser3,[email protected],data,New_user3 
0

следующие работы для меня:

START=2 
NUM=1 
sed -i -e "$START,+${NUM} s/user/New_user/g; $START,+${NUM} s/fuser/New_fuser/g; $START,+${NUM} s/luser/New_luser/g" file 

Как вы можете видеть, есть несколько изменений:

диапазон
  1. линия должна присутствовать в каждом выражении
  2. диапазон должен быть представлен (в данном случае) в качестве номера стартовой линии и количества строк (число затронутых линий равно NUM + 1)
  3. Вы помещаете лишние символы апострофа.
0

Использование одного s команды:

start=1 
end=2 
sed -e "$start,$end s/\([fl]*\)user/New_\1user/g" file 

[fl]*user будет соответствовать user с дополнительным f или l первой буквы

выход:

New_user1,New_fuser1,New_luser1,[email protected],data,New_user1 
New_user2,New_fuser2,New_luser2,[email protected],data,New_user2 
user3,fuser3,luser3,[email protected],data,user3 
Смежные вопросы