我有一个包含很多java文件的目录,每个文件中都有一个类变量:

String system = "x";

我希望能够创建一个bash脚本,我在同一个目录中执行该脚本,它将只指向目录中的java文件,并将xthis个实例替换为y个.这里xy是一个单词.现在,这可能不是java脚本中word x的唯一实例,但它肯定是第一个.

我希望能够在命令行中执行脚本,类似于:

changesystem.sh -x -y

通过这种方式,我可以指定x应该是什么,以及我希望用它替换的y.我找到了一种方法,可以找到并打印第一个图案实例所在的行号:

awk '$0 ~ /String system/ {print NR}' file

然后,我发现如何使用以下方法替换给定行上的子字符串:

awk 'NR==line_number { sub("x", "y") }'

然而,我还没有找到将它们结合起来的方法.也许还有更简单的方法?或者,一种更好、更有效的方法?

任何帮助/建议都将不胜感激

推荐答案

您可以使用以下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,然后移动到下一行,否则,只按原样打印该行.

Linux相关问答推荐

在树莓派内核中找不到arch/arm/kernel/calls.S

JSON 转义 CURL/JQ 输出

重命名具有相同前缀的文件对中最旧的文件

如何在Linux下使用正则表达式更改文件名

在不编写任何代码的情况下,是否有一个命令可以检索当前 shell 的亲和力中的可用内核数?

如何拆分和计算 Bash 中单词的出现次数?

在 SLURM 作业(job)脚本中设置和传递字符串变量

如何在makefile中包含静态库

如何/在哪里可以找到要修复的 Linux 内核错误?

我在哪里放置第三方库来设置 C++ Linux 开发环境?

使用 awk 或 sed 删除特定字符

如何在 Linux 中设置目录大小限制?

如何在 Ubuntu 上安装 chkconfig?

Linux 上的 C++ 开发 - 我从哪里开始?

kdevtmpfsi 使用整个 CPU

如何将 bash 别名定义为多个命令的序列?

bash shell 脚本函数定义(如f () {})中使用的括号是什么?它与使用function关键字不同吗?

从 FTP 服务器下载所有文件

我可以告诉 Linux 不要换出特定进程的内存吗?

linux脚本杀死java进程