3

Содержание source.txt:

gold  green white black blue
yellow magenta brown 
tram kilo charlie tango

Всем привет! Мне нужно разгадать тайну.

Я пытаюсь запустить небольшой скрипт, чтобы grep файл source.txt , труба grep выводит sed заменить строку и сохраняет эту строку в новом файле pol.txt

grep -l "gold" source.txt | xargs sed  's/green/red/' >  pol.txt

Вместо того, чтобы хранить только эту строку в pol.txt:

gold  red white black blue

У меня есть весь файл со строкой, которую я заменил

gold  red white black blue
yellow magenta brown 
tram kilo charlie tango

Когда я удаляю опцию -l из команды grep, у меня есть это и, конечно, ничего в pol.txt

sed: can't read gold: No such file or directory
sed: can't read green: No such file or directory
sed: can't read white: No such file or directory
sed: can't read black: No such file or directory
sed: can't read blue: No such file or directory

grep нужен в качестве тестера и, к сожалению, "если" не вариант.

2 ответа2

4

Чтобы выбрать любую строку, содержащую gold из source.txt и заменить первое вхождение green на red:

$ sed  -n '/gold/{s/green/red/; p}' source.txt 
gold  red white black blue

Чтобы сохранить это в файле:

sed  -n '/gold/{s/green/red/; p}' source.txt  >pol.txt

Как это устроено

  • -n говорит sed не печатать строки, если мы явно не попросим об этом.

  • /gold/ выбирает строки, которые соответствуют регулярному выражению gold .

  • s/green/red/ выполняет замену

  • p печатает.

Использование awk

С той же логикой:

$ awk '/gold/{gsub(/green/, "red"); print}' source.txt 
gold  red white black blue

Используя grep

Если мы вынуждены, по причинам, еще не объясненным, использовать конвейер grep, то попробуйте:

$ grep -l --null "gold" source.txt | xargs -0 sed  -n '/gold/s/green/red/p'
gold  red white black blue
1

grep -l "gold" source.txt выведет source.txt если файл содержит слово gold xargs sed 's/green/red/' запустит sed 's/green/red/' source.txt и окончательное перенаправление сохранится результат в вашем выводе.

Если я правильно понимаю ваши намерения, вы хотите следующую команду:

sed -n '/gold/s/green/red/p' source.txt > pol.txt

/gold/ выбирает строки, соответствующие gold а команда s выполняет замену, которую вы хотите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .