Поиск текста в файле - PullRequest
0 голосов
/ 07 июня 2018

Это то, что я пытаюсь достичь, кажется, есть некоторые ошибки.Escape-последовательности в строках, которые еще нужно добавить

search_string="LoadModule rewrite_module "${ORACLE_HOME}/ohs/modules/mod_rewrite.so"
insert_string1="LoadModule reqtimeout_module "${ORACLE_HOME}/modules/mod_reqtimeout.so"
insert_string2="<IfModule reqtimeout_module>RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500 </IfModule>"
grep "$insert_string1" httpds.conf;
if [ $? -ne 0 ]; then
    sed -r -e ":a;/${search_string}/ {n;s/$/${insert_string1}/};ta" httpds.conf
    sed -r -e ":a;/${insert_string1}/ {n;s/$/${insert_string2}/};ta" httpds.conf
    echo "Configuration inserted successfully"
fi
#################### Выходной файл должен выглядеть следующим образом
LoadModule unique_id_module "${ORACLE_HOME}/ohs/modules/mod_unique_id.so"
LoadModule setenvif_module "${ORACLE_HOME}/ohs/modules/mod_setenvif.so"
LoadModule context_module "${ORACLE_HOME}/ohs/modules/mod_context.so"
LoadModule rewrite_module "${ORACLE_HOME}/ohs/modules/mod_rewrite.so"
LoadModule reqtimeout_module "${ORACLE_HOME}/modules/mod_reqtimeout.so"
<IfModule reqtimeout_module>
   RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500 
</IfModule>"

LoadModule dumpio_module "${ORACLE_HOME}/ohs/modules/mod_dumpio.so"

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Под добавлением вы подразумеваете добавление в конец строки после строки с соответствием?Если так, то хитрость заключается в том, чтобы заставить sed повторно сканировать шаблон, иначе он пропустит строку после той, где добавлен SampleInsert.Вам нужно использовать метку и перейти к командам метки:

$ cat configfile.txt
1 gary     tty7
2 mysearchstringgary     tty7
3 testingmysearchstring gary     tty7
4 gary     tty7mysearchstring
5
6 gary     tty7mysearchstring
7 gary     tty7
8 gary     tty7
$
$
$ sed -r -e ':a;/mysearchstring/ {n;s/$/SampleInsert/};ta' configfile.txt
1 gary     tty7
2 mysearchstringgary     tty7
3 testingmysearchstring gary     tty7SampleInsert
4 gary     tty7mysearchstringSampleInsert
5 SampleInsert
6 gary     tty7mysearchstring
7 gary     tty7SampleInsert
8 gary     tty7
$ 

Так как вы не предоставили тестовые данные, я просто придумал текст поиска в разных местах.Не забудьте пустую строку для тестирования.

Команда sed использует аргументы -r -e для расширенных регулярных выражений.Внутри одинарных кавычек находятся несколько команд, разделенных точками с запятой.Сначала установите метку с именем a, затем найдите строки, соответствующие «mysearchstring».Если найдено, запустите команды, окруженные фигурными скобками и разделенные точками с запятой.n означает чтение следующей строки в буфере шаблонов, так как это строка, к которой вы хотите добавить текст.Найдите конец строки и добавьте «SampleInsert».Теперь эта строка может содержать текст для поиска, поэтому ее также необходимо искать.Вот почему следующая команда - это та, что означает перейти к метке a.Метка a находится непосредственно перед поиском поисковой строки, поэтому повторная проверка текущей строки для поискового шаблона приводит к появлению.

EDIT: если используется внутри скрипта bash, где значения для поиска и вставки являются переменными, определенными всценарий:

#!/bin/bash

readonly searchstr='mysearchstring'
readonly insertstr='SampleInsert'

sed -r -e ":a;/${searchstr}/ {n;s/$/${insertstr}/};ta" configfile.txt

Или переданный в аргументе сценарию (должен быть обработан некоторые ошибки, но это только для иллюстрации):

$ fixfile.sh mysearchstr SampleInput

#!/bin/bash

readonly searchstr=$1
readonly insertstr=$2

sed -r -e ":a;/${searchstr}/ {n;s/$/${insertstr}/};ta" configfile.txt
0 голосов
/ 08 июня 2018

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

#!/bin/bash

FIND=".el"; # assign whatever variable you want
APPEND="Hi";
awk -v find="$FIND" -v append="$APPEND" '{print $0 (index($0, find) != 0 ? "\n"append : "")}' configfile.txt
0 голосов
/ 07 июня 2018

Вы можете проверить это с помощью sed:

sed -i '/string/a SampleInsert/' configfile.txt

, если -i не поддерживается, то вы можете просто перенаправить вывод в новый файл:

sed '/string/a SampleInsert/' configfile.txt > output_file.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...