Использование grep для поиска конкретной строки — передача этой строки в sed — редактирование символа в позиции x

#regex #bash #shell #sed #grep

#регулярное выражение #bash #оболочка #sed #grep

Вопрос:

Мне нужно найти все строки, начинающиеся с 1, и заменить позицию 14. Мне нужно найти все строки, начинающиеся с 5, и заменить на позицию 41. — и т. д.

Я хочу заменить все вхождения строки:

 sed 's/string/replace/g' - 
  

строка может измениться, и я действительно хочу заменить только первую позицию — эта позиция всегда одинакова и находится в позиции 14, поэтому:

 sed 's/string/replace/14'
  

В разных строках этот символ не требуется заменять. Я хочу заменить позицию символа только в том случае, если его строка начинается с определенного кода.

Эта строка находится в месте 14 в строке, начинающейся с 1 Эта строка находится в месте 41 в строке, начинающейся с 5 Эта строка находится в месте 45 в строке, начинающейся с 8

Найдите строку

 grep -E '^1' $DEST/$FILE_NAME$DATE.txt
  

Поэтому:

 grep -E '^1' $DEST/$FILE_NAME$DATE.txt | sed 's/./'$CODE'/14'
grep -E '^5' $DEST/$FILE_NAME$DATE.txt | sed 's/./'$CODE'/41'
grep -E '^8' $DEST/$FILE_NAME$DATE.txt | sed  's/./'$CODE'/45'
  

Однако вышеприведенное на самом деле не записывается в файл, но, похоже, делает то, что я хочу.

 grep -E '^8' $DEST/$FILE_NAME$DATE.txt | sed  -i 's/./'$CODE'/45' $DEST/$FILE_NAME$DATE.txt
  

Приведенное выше записывается в файл, но игнорирует выделенную строку и заменяет символ в позиции 45 для каждой строки.

Кроме того, несколько похожих файлов могут быть объединены — поэтому мне нужно найти все строки, начинающиеся с 1, и заменить позицию 14. Мне нужно найти все строки, начинающиеся с 5, и заменить на позицию 41. — и т. д.

Заранее извините, если на это легко ответить другим сообщением — вероятно, с использованием awk и regex. Однако я не нашел этот конкретный случай.

Комментарии:

1. зачем использовать grep, а затем вывод grep в формате sed, когда sed также может выбирать файлы, подобные grep?

2. Я сталкивался с этим — не уверен, понял ли я это таким образом, чтобы сделать это. Можете ли вы привести мне пример?

3. sed -n «s / pattern1 / pattern2 / p» — это общий синтаксис для выбора только строк, содержащих pattern1, и замены pattern1 на pattern2. то есть, как бы выполняя grep, затем работайте над соответствующими строками шаблона.

4. Потому что мне нужно заменить на основе другого шаблона, который я ищу. tkocmathla только что получил его

5. вы можете объединять выражения sed вместе, разделенные символом «;». sed -n «/pattern / p» выбирает только.

Ответ №1:

sed может вносить изменения в строки, соответствующие регулярному выражению, поэтому grep в этом нет необходимости. Сначала появляется соответствующее выражение, затем выражение подстановки:

 sed -i "/^1/ s/./$CODE/14" $DEST/$FILE_NAME$DATE.txt 
sed -i "/^5/ s/./$CODE/41" $DEST/$FILE_NAME$DATE.txt 
sed -i "/^8/ s/./$CODE/45" $DEST/$FILE_NAME$DATE.txt 
  

Выбор строк с sed (адресами)