2016-08-17 5 views
1

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

stuff1 \t names names names 
stuff2 \t \t names names names 
stuff3 \t \t names names names 
stuff4 \t names names names 

То, что я хотел бы сделать, это заменить двойные язычки таким образом, что бы вставить первое слово между ними. Как это:

stuff2 \t stuff2 \t names names names 
stuff3 \t stuff3 \t names names names 

То, что я попытался было

sed 's/\t\t/\t(.*\t\t\)\t/' 

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

\t\t 

в

\t(.*\t\t\)\t 

Есть ли способ «убежать от группы побега»?

ответ

1

Просто матч им так:

$ sed -r 's/^(\S+)\t\t/\1\t\1\t/g' file 
stuff1 names names names 
stuff2 stuff2 names names names 
stuff3 stuff3 names names names 
stuff4 names names names 

Это:

  • s/find/replacement/g
    полное выражение, чтобы найти find и заменить его replacementg lobally.
  • ^(\S+)\t\t
    соответствует началу строки, за которой следует слово (вы также можете сказать [^\t]*). Затем сопоставьте две вкладки.
  • \1\t\1\t
    замените это на захваченное совпадение, за которым следует вкладка, а затем снова.
  • -r
    этот sed флаг используется, чтобы иметь расширенное регулярное выражение, которые позволяют поймать группу только с (...) вместо \(...\).

Кстати, мне, выход вашей команды:

$ sed 's/\t\t/\t(.*\t\t\)\t/' file 
stuff1 names names names 
stuff2 (.* ) names names names 
stuff3 (.* ) names names names 
stuff4 names names names 

Поскольку вы используете .* в сменной части, так что буквально, а не как обычный выражение.

+1

Ах, спасибо большое! –

Смежные вопросы