如果文件中没有值,则awk应用更改

时间:2017-01-24 02:04:53

标签: bash awk

我有一个文件说file1,内容如下

cat file1
test
test1

我在这里将raspberry这个词附加到多个文件test和test1,它运行正常。

while IFS= read -r i; do
  awk '/\[groups/{a=1;print;next} /^\[/{a=0}a && /=/{$0=$0",raspberry"}7' "$i" > "$i.tmp" &&
  mv "$i.tmp" "$i"
done < file1

问题是,如果我运行脚本10次,它会将树莓字附加10次。

我们有什么方法可以检查树莓已经存在的字样,如果不存在更改,则只需退出吗?

3 个答案:

答案 0 :(得分:0)

您可以使用grep列出找到的匹配项,然后使用wc来计算grep返回的行数。

#!/bin/bash
while IFS= read -r i; do
    #If grep returns zero lines, raspberry was not found:
    if [[ $(echo $i | grep -c raspberry) -eq 0 ]]
    then
        awk '/\[groups/{a=1;print;next} /^\[/{a=0}a && /=/{$0=$0",raspberry"}7' "$i" > "$i.tmp" &&
        mv "$i.tmp" "$i"
    fi
done < file1

答案 1 :(得分:0)

试试这个:

while IFS= read -r i; do
  awk '/\[/{f=/groups/} f && !/raspberry/{if (NF) $0=$0",raspberry"} 1' "$i" > "$i.tmp" &&
  mv "$i.tmp" "$i"
done < file

答案 2 :(得分:0)

awk '
   # reset per file
   FNR == 1 { a = 0; Fs[FILENAME]++ }
   # define state of a at [ occurence
   /^\[/ { a = ( $0 ~ /\[groups/) ? 1 : 0 }

   # modify the line if ...
   a && /=/ && $0 !~ /raspeberry/ && $0 !~ /\[groups/ { $0 = $0 ",raspberry"}
   # output the result to tmp file (per filename)
   { print > ( FILEMANE ".tmp") }

   # mv all tmp to original name
   END { for ( F in Fs ) system ( "mv " F ".tmp " F ) }
   ' $( cat file1 )
  • 在1 awk调用中完成(将mv调用为子shell,此部分可以在shell中进行优化)
  • source是file1的cat而不是循环
  • 使用文件FNR == 1
  • 开头的重置处理每个文件
  • 假设同一行[group可能发生=(如果没有,a && /=/ && $0 !~ /raspeberry/ && $0 ~ /\[groups/可以简化
  • 我没有对mv修改过的文件(不是请求的一部分)进行任何检查,但这是一个很好的建议。