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