Shell脚本 - 在“触摸”文件之前搜索。 (CSH)

时间:2014-04-24 17:28:50

标签: shell unix csh

家庭作业 - 不要只是给我一个答案,但我已经被困在这几天了。这也解释了我为什么不能使用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 if else。现在我得到一个" if表达式语法"错误 - 这让我觉得我根本不能使用grep,需要重新格式化或使用别的东西。

1 个答案:

答案 0 :(得分:0)

您需要检查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的实际价值,只需使用terser表格

#!/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

第二个是我最喜欢的。