【问题标题】:Use a bash script/grep/sed in order to replace class names with the file name itself使用 bash 脚本/grep/sed 将类名替换为文件名本身
【发布时间】:2017-11-09 12:45:15
【问题描述】:

我目前有一个目录,其中包含许多不同名称的 .java 文件。 IE。名称.java、名称2.java、名称3.java

我正在尝试编写一个脚本,循环遍历目录中的所有文件并更改它们的类名(在文件内)以匹配文件名本身。

目前,所有 .java 文件都包含类名 MyCritter。我想将每个文件中的所有 MyCritter 实例更改为特定 java 文件本身的名称。我编写了一个脚本来尝试替换所有 MyCritter 术语,但是我的输出没有任何变化。打印文件名的回显行后,代码被冻结:

#!/bin/bash

dir1="/Users/path to folder"
subs=`ls $dir1`
for a in $subs;
do
  echo a
  [ -f "$a" ]
  grep -lr "MyCritter" * | xargs sed “s/MyCritter/$a/g”
done

输出到终端:name.java --> 然后无限循环/卡住

上面的代码打印了一次目录中第一个文件的名称,但随后卡住了。当我将第二行更改为:[ -f "$a" ] || continue 时,它会运行整个代码,但无法更新文件。

我尝试过 grep 的其他变体,包括:

grep -lr -e "MyCritter" * | xargs sed -i “s/MyCritter/$a/g”
grep -lr -e "MyCritter" . | xargs sed -i “s/MyCritter/$a/g”
grep -lr -e "MyCritter" . | xargs sed “s/MyCritter/$a/g”

我主要是使用这个网站来指导我:http://isaacsukin.com/news/2013/06/command-line-tip-replace-word-all-files-directory

我们将不胜感激任何朝着正确方向的推动!

【问题讨论】:

  • sed 命令周围的引号是非标准的:,而不是 "
  • 首先,始终通过ShellCheck 运行您的 bash 代码,您对发布的内容有疑问。你为什么用xargs

标签: java linux bash shell sed


【解决方案1】:

使用 GNU awk 进行就地编辑:

awk -i inplace '{gsub(/MyCritter/,FILENAME)} 1' *.java

或者如果你想去掉“.java”:

awk -i inplace 'FNR==1{f=FILENAME; sub(/\.java$/,"",f)} {gsub(/MyCritter/,f)} 1' *.java

【讨论】:

    【解决方案2】:

    正如其他人提到的,您的代码中存在语法错误,shellcheck 可以轻松检测到这些错误。

    可以做到这一点的另一种方法是:

    #!/bin/bash
    
    dir1="Absolute_path_for_dir"
    for f in $dir1/*.java;do
        # Extract name from /path/name.java
        filename=$(basename "$f" .java) 
    
        # Replace ALL occurrences of MyCritter with filename in file $f
        sed -i "s/MyCritter/$filename/g" "$f"  
    done
    

    【讨论】:

      【解决方案3】:

      如果您不需要解决方案是脚本形式,在终端中,只需cd 到包含*.java 文件的目录并使用以下命令:

      for f in *.java; do sed -i "s/MyCritter/"${f%.*}"/g" "$f"; done
      

      sed"${f%.*}" 部分命令 返回不带扩展名文件名,并用它来替换MyCritter

      【讨论】:

        猜你喜欢
        • 2021-03-21
        • 2013-07-21
        • 2013-04-30
        • 2011-07-29
        • 2020-04-24
        • 2017-11-09
        • 2021-09-29
        • 2011-02-12
        • 1970-01-01
        相关资源
        最近更新 更多