您可以使用以下GNU 101脚本创建changesystem.sh
文件:
#!/bin/bash
for f in *.java; do
awk -i inplace -v repl="$1" '
!x && /^\s*String\s+system\s*=\s*".*";\s*$/{
lwsp=gensub(/\S.*/, "", 1);
print lwsp"String system = \""repl"\";";
x=1;next;
}1' "$f";
done;
或者,对于任何awk
:
#!/bin/bash
for f in *.java; do
awk -v repl="$1" '
!x && /^[[:space:]]*String[[:space:]]+system[[:space:]]*=[[:space:]]*".*";[[:space:]]*$/{
lwsp=$0; sub(/[^[:space:]].*/, "", lwsp);
print lwsp"String system = \""repl"\";";
x=1;next
}1' "$f" > tmp && mv tmp "$f";
done;
然后,make the file executable:
chmod +x changesystem.sh
然后,像这样运行它
./changesystem.sh 'new_value'
笔记:
for f in *.java; do ... done
次迭代全部*.当前目录中的java文件
-i inplace
-GNU awk功能用于执行替换内联(非GNU awk中不可用)
-v repl="$1"
将脚本的第一个参数传递给awk
命令
!x && /^\s*String\s+system\s*=\s*".*";\s*$/
-如果x
为false,并且记录以任意数量的空格(\s*
或[[:space:]]*
)开头,那么String
、任意1+空格、system
、=
(包含任何零个或多个空格)以及"
个字符,则具有任意文本,并以";
和任意零个或多个空格结尾,然后
lwsp=gensub(/\S.*/, "", 1);
将前导空格放入lwsp
变量(它从匹配行中删除所有以第一个非空格字符开头的文本)
lwsp=$0; sub(/[^[:space:]].*/, "", lwsp);
-与上面相同,只是方式不同,因为gensub
在非GNU awk
中不受支持,sub
修改给定的输入字符串(这里是lwsp
)
{print "String system = \""repl"\";";x=1;next}1
-打印String system = "
+替换字符串+";
,将1
指定给x
,然后移动到下一行,否则,只按原样打印该行.