2012-05-16 3 views
16

У меня есть файл со следующим содержимым:заменить неизвестную строку между двумя известными строками с СЭД

WORD1 WORD2 WORD3

Как я могу использовать СЭД, чтобы заменить строку между WORD1 и WORD3 с foo, таким образом, что содержимое файла изменено на следующее ?:

WORD1 foo WORD3

Я попытался следующие, но, очевидно, я что-то не хватает, потому что не дает желаемых результатов:

sed -i '' 's/WORD1.*WORD3/foo/g' file.txt

+0

Может ли быть что-то вроде ' WORD1 foo WORD3 bar WORD1 baz WORD3' в вашей строке (т.е. е. более одного соответствия для каждой строки)? –

+0

А-а - хороший вопрос, но нет, в этом сценарии не обязательно вмещать более одного матча. –

ответ

15
sed -i 's/WORD1.*WORD3/WORD1 foo WORD3/g' file.txt 

или

sed -i 's/(WORD1).*(WORD3)/\1 foo \2/g' file.txt 

Вам может понадобиться, чтобы избежать круглые скобки, зависит от вашего SED варианта.

+0

Что делать, чтобы WORD1, WORD2 и WORD3 были любыми строками? –

+0

@ValeriyVan, вам нужно избегать разграничения символов в ваших СЛОВАХ ('/' в моем примере), а также всех других символов, которые 'sed' обрабатывает как управляющие. – vyegorov

2

содержание образца file.txt

$ cat file.txt 
WORD1 WORD2 WORD3 
WORD4 WORD5 WORD6 
WORD7 WORD8 WORD9 

(Коррекция @DennisWilliamson в комментарии)
$ sed -e 's/\([^ ]\+\) \+\([^ ]\+\) \+\(.*\)/\1 foo \3/' file.txt

WORD1 foo WORD3 
WORD4 foo WORD6 
WORD7 foo WORD9 

в то время как awk несколько проще

$ awk -F' ' '{ print $1" foo "$3 }' file.txt

WORD1 foo WORD3 
WORD4 foo WORD6 
WORD7 foo WORD9 
+1

Не нужно избегать каких-либо пробелов. И '[^ \]' означает «любой символ, отличный от пробела или обратного слэша». Я бы предложил '\ +' вместо '*', поскольку, как и ваша команда, можно заменить пустую строку. Также 'g' не нужно - как это перенаправление. –

+0

@DennisWilliamson, оцените ваш комментарий, спасибо. – Rony

+0

Теперь это не сработает. Вы неправильно поняли, что я имел в виду. 'sed -e 's/\ ([^] \ + \) \ + \ ([^] \ + \) \ + \ (. * \)/\ 1 foo \ 3/'file.txt' –

5

Это может работать для вас:

sed 's/\S\+/foo/2' file 

или, возможно:

sed 's/[^[:space:]][^[:space:]]*/foo/2' file 

Если WORD1 и WORD3 встречаются более одного раза:

echo "WORD1 WORD2 WORD3 BLA BLA WORD1 WORD4 WORD3" | 
sed 's/WORD3/\n&/g;s/\(WORD1\)[^\n]*\n/\1 foo /g' 
WORD1 foo WORD3 BLA BLA WORD1 foo WORD3 
+0

'[^ [: space:]] [^ [: space :]] * 'можно заменить на' [^ [: space:]] \ + '(как вы использовали в первом примере) в некоторых версиях' sed'. '/ 2' - приятный штрих. + 1 –

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