Вопрос по regex, bash – заменить неизвестную строку между двумя известными строками на sed

20

У меня есть файл со следующим содержанием:

WORD1 WORD2 WORD3

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

WORD1 foo WORD3

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

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

Может ли быть что-то вродеWORD1 foo WORD3 bar WORD1 baz WORD3 в вашей строке (т. е. более одного совпадения на строку)? Tim Pietzcker
Ах, хороший вопрос, но нет, на самом деле нет необходимости учитывать более одного совпадения в этом сценарии. Camden S.

Ваш Ответ

3   ответа
21
sed -i 's/WORD1.*WORD3/WORD1 foo WORD3/g' file.txt

или же

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded/Error: User Rate Limit ExceededsedError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded(Error: User Rate Limit Exceeded)
Error: User Rate Limit Exceededsed: -e expression #1, char 30: invalid reference \2 on 's' command's RHSError: User Rate Limit Exceeded
3

содержание образца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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsed -e 's/\([^ ]\+\) \+\([^ ]\+\) \+\(.*\)/\1 foo \3/' file.txt
Error: User Rate Limit Exceeded[^\ ]Error: User Rate Limit Exceeded\+Error: User Rate Limit Exceeded*Error: User Rate Limit ExceededgError: User Rate Limit Exceeded
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
[^[:space:]][^[:space:]]*Error: User Rate Limit Exceeded[^[:space:]]\+Error: User Rate Limit ExceededsedError: User Rate Limit Exceeded/2Error: User Rate Limit Exceeded

Похожие вопросы