shell:替换文件中Line的一部分

时间:2015-09-23 08:22:59

标签: bash shell awk sed sh

我是shell编程的新手,必须执行以下任务。 我在第28行(静态)有一个带有以下行的文件。

page.sysauth = "Admin"

每次创建sysauth的新条目时,我都希望使用shell脚本替换此行。

page.sysauth = {“Admin”,“root”} page.sysauth = {“Admin”,“root”,“newAdmin”} 等

此外,我还想删除此sysauth变量中的条目

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

请提供实现此目的的指示。

编辑: 感谢您的投入: 假设:首次进入应该存在。例如: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

2 个答案:

答案 0 :(得分:1)

如果您的条目始终是没有逗号的单个单词,则可以使用简单的sed脚本:

@Provides
@Singleton
public void repository(Dbi dbi) {
    // dbi.onDemand(whateverYourClassIs.class)
}

在添加或删除列表时,脚本不会检查列表中是否已存在条目。对于更复杂的任务,我可能会切换到真正的编程语言。

答案 1 :(得分: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

使用带有2次读取的awk(双YourFile不是错误并且是必需的)