我有一个文件说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次。
我们有什么方法可以检查树莓已经存在的字样,如果不存在更改,则只需退出吗?
答案 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 )
FNR == 1
[group
可能发生=
(如果没有,a && /=/ && $0 !~ /raspeberry/ && $0 ~ /\[groups/
可以简化