2015-09-23 4 views
1

Я новичок в программировании оболочки и должен был выполнить следующую задачу. У меня есть файл со следующей строкой в ​​строке № 28 (статический).shell: Замена части строки в файле

page.sysauth = "Admin" 

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

page.sysauth = { "Admin", "корень"} page.sysauth = { "Admin", "корень", "newAdmin"} т.д.

Кроме того, я хотел бы, чтобы удалить записи из эта переменная sysauth

page.sysauth = {"Admin", "root", "newAdmin"} 
page.sysauth = {"Admin", "root"} 
page.sysauth = "Admin" 

Просьба указать указатели для достижения этой цели.

EDIT: Благодарим вас за ввод: Успение: Должна присутствовать первая запись. например: page.sysauth = "Admin" Сценарий не работает, если page.sysauth = ______ (пустой).

Вот мой рабочий сценарий sysauth_adt.sh

#!/bin/bash 
add() { 
    sed -i~ -e '28 { s/= "\(.*\)"/= {"\1"}/; # Add curlies to a single entry. 
        s/}/,"'"$entry"'"}/  # Add the new entry. 
        }' "$file" 
} 

remove() { 
    sed -i~ -e '28 { s/"'"$entry"'"//;  # Remove the entry. 
        s/,}/}/;    # Remove the trailing comma (entry was last). 
        s/{,/{/;    # Remove the leading comma (entry was first). 
        s/,,/,/;    # Remove surplus comma (entry was inside). 
        s/{"\([^,]*\)"}/"\1"/ # Remove curlies for single entry. 
        }' "$file" 
} 

if (($# == 3)) ; then 
    file=$1 
    action=$2 
    entry=$3 
    if [[ $action == add ]] ; then 
     if head -n28 $1 | tail -n1 | grep -q $3 ; then 
       echo 0 
     else 
       add 
     fi 
    elif [[ $action == remove ]] ; then 
     if head -n28 $1 | tail -n1 | grep -q $3 ; then 
       remove 
     else 
       echo 0 
     fi 
    fi 
else 
    echo "Usage: ${0#*/} file (add | remove) entry" >&2 
    exit 1 
fi 

ответ

1

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

#!/bin/bash 
add() { 
    sed -i~ -e '28 { s/= "\(.*\)"/= {"\1"}/; # Add curlies to a single entry. 
        s/}/,"'"$entry"'"}/  # Add the new entry. 
        }' "$file" 
} 

remove() { 
    sed -i~ -e '28 { s/"'"$entry"'"//;  # Remove the entry. 
        s/,}/}/;    # Remove the trailing comma (entry was last). 
        s/{,/{/;    # Remove the leading comma (entry was first). 
        s/,,/,/;    # Remove surplus comma (entry was inside). 
        s/{"\([^,]*\)"}/"\1"/ # Remove curlies for single entry. 
        }' "$file" 
} 

if (($# == 3)) ; then 
    file=$1 
    action=$2 
    entry=$3 
    if [[ $action == add ]] ; then 
     add 
    elif [[ $action == remove ]] ; then 
     remove 
    fi 
else 
    echo "Usage: ${0#*/} file (add | remove) entry" >&2 
    exit 1 
fi 

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

+0

Благодаря @choroba, Так что вы можете, пожалуйста, как мы можем отдельно проверить, если шаблон существует в данный конкретный номер строки. Так что дубликатов можно избежать. – Haswell

+0

@Tegra: Как я уже говорил, я, вероятно, буду использовать Perl. – choroba

1
awk -F '[[:blank:]]+=[[:blank:]]+' ' 
    # load every single entry 
    NR != 28 && FNR == NR && $1 ~ /^page.sysauth$/ && $0 !~ /\{.*\}/ { aSysAdd[ ++SysAdd] = $2} 
    # load special line 28 
    NR == 28 { 
     gsub(/^{|}$/, "", Datas = $2) 
     SysOrg = split(Datas, aSysOrg, /[[:blank:]]*,[[:blank:]]*/) 
     } 
    # print standard lines 
    FNR != NR && $1 !~ /^page.sysauth$/ { print } 
    # print line 28 (new version) 
    FNR != NR && FNR == 28 { 
     printf "page.sysauth = {" aSysOrg[ 1] 
     for(i = 2; i <= SysOrg; i++) printf ", %s", aSysOrg[ i] 
     for(i = 1; i <= SysAdd; i++) printf ", %s", aSysAdd[ i] 
     print "}" 
    # don't print other page.sysauth 
    } 
' YourFile YourFile > YourFile.new 
mv YourFile.new YourFile 

Использование AWK с 2 чтения (двойной YourFile не является ошибкой и обязательным)

+0

Спасибо, что будут входные аргументы этой команды awk – Haswell

+0

файла 'YourFile' в этом примере примера, но вы можете изменить его на любое полное имя файла. Это означает, что он не будет работать на потоке ввода (не так) – NeronLeVelu

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