Shell脚本-在'之前搜索;触摸';档案。(csh)

Shell脚本-在'之前搜索;触摸';档案。(csh),shell,unix,csh,Shell,Unix,Csh,家庭作业-不要只是给我一个答案,但我已经被困在这个问题上好几天了。这也解释了为什么我坚持使用csh,这当然加剧了问题 shell脚本需要在文件中搜索字符串,并将其替换为新字符串,如果已找到字符串且文件已更改,则创建备份文件。很简单,对吧 这是我的密码 #!/bin/csh set currentWord=$1 set newWord=$2 set fi

家庭作业-不要只是给我一个答案,但我已经被困在这个问题上好几天了。这也解释了为什么我坚持使用csh,这当然加剧了问题

shell脚本需要在文件中搜索字符串,并将其替换为新字符串,如果已找到字符串且文件已更改,则创建备份文件。很简单,对吧

这是我的密码

    #!/bin/csh                                                                     
set currentWord=$1
set newWord=$2
set fileName=$3

#sed -i.bak -e  "s/$1/$2/g" $3                                                  

  if  (grep -q $1 $3)  then
     sed -i.bak -e "s/$1/$2/g" $3
   else
     echo "The string is not found."
   endif

我遇到的问题是,除非找到字符串,否则它不应该“触摸”文件。我这样做的方式创建了文件,有时它们最终都是相同的文件。我也尝试过只使用一个sed命令,但最接近的解决方案是将sed命令转换为if-then-else。现在我遇到了一个“if expression syntax”错误,这让我觉得我根本不能像那样使用grep,需要重新格式化它或使用其他东西。

您需要检查
grep
的退出状态。有几种方法可以做到这一点

你可以:

调用
grep
,然后检查特殊变量
$status
,如中所示

#!/bin/csh

set currentWord=$1
set newWord=$2
set fileName=$3

grep -q $currentWord $fileName

if !($status) then
    sed -i.bak -e "s/$currentWord/$newWord/g" $fileName
else
    echo "The string is not found."
endif
或者,因为这里不需要实际的
$status
值,所以只需使用更简洁的形式

#!/bin/csh

set currentWord=$1
set newWord=$2
set fileName=$3

if { grep -q $currentWord $fileName } then
    sed -i.bak -e "s/$currentWord/$newWord/g" $fileName
else
    echo "The string is not found."
endif

第二个是我最喜欢的。

非常感谢,第二个选项很有魅力。这正是我想要完成的,只是我一直在做。你也可以通过管道将这两个-
grep-q$currentWord$fileName&&sed-I.bak-e“s/$currentWord/$newWord/g”$fileName
。只有当
grep
命令显示成功时,才会运行
sed
命令……循环和管道(@Twalberg)建议都起了作用,现在我发现自己又卡住了。有没有一种简单的方法可以通过标准输入接受无限的指定文件?我正在尝试的一切要么只接受第一个文件(调整sed/grep),要么运行该目录中的每个文件(通配符/regex)。两个小时后,我想我又一次把事情复杂化了。