2016-09-05 7 views
0

Так скажем, у меня есть файлИспользование СЭД, чтобы добавить строку, игнорируя пустое пространство для конкретной линии

a   b   c 
a   b    
a 

, и я хочу, чтобы добавить строку ниже линии, содержащей Ь и с. Поэтому я пишу команду:

sed -i '/s*a b c/a new line' 

Но это не работает. Что не так с командой sed, которую я написал?

ответ

0

У вас неправильный образец. Попробуйте это вместо

sed -e '/a *b *c/a new line' file.txt 

Если вы хотите изменить исходный файл в месте, добавьте -i флаг. Вероятно, лучше было бы протестировать его без него.

+0

Пространство звезда Продольный является излишним, хотя. – tripleee

+0

Это просто означает, что если за 'c' следует что-то, это должно быть пространственным символом. – redneb

+1

Нет, это не так. Это означает, что если есть место, это нормально, а если нет, это тоже хорошо. Он не делает ничего, чтобы предотвратить совпадение, если следующий символ не является пространством. В более общем плане указание необязательного начального или конечного контекста для сопоставления бесполезно (если вы специально не захватываете или не обрабатываете только согласованную часть). – tripleee

0

Вы должны соответствовать линии (или уникальную часть) первой линии, сделайте следующее:

sed -i '/^a[[:blank:]]*b[[:blank:]]*c$/a new line' file.txt 
  • ^a[[:blank:]]* матчи a в начале строки с последующим любым количеством пробелов, подобно b[[:blank:]]* матчей b с последующим любым количеством пробелов

  • c$ матчей c в конце линии

Пример:

$ cat file.txt 
a   b   c 
a 
a 
      b    
$ sed '/^a[[:blank:]]*b[[:blank:]]*c$/a new line' file.txt 
a   b   c 
new line 
a   b    
a