Shell脚本无法正常工作

时间:2014-05-16 23:59:54

标签: linux shell scripting

我的部分shell脚本存在问题

if [ -e ~/linux/content.txt ]
then
cat ~/linux/content.txt | sed -re 's/<head>//g' > ~/linux/content_temp.txt
rm content.txt
cat ~/linux/content_temp.txt | sed -re 's|</head>||g' > ~/linux/content.txt
rm content_temp.txt
cat ~/linux/content.txt | sed -re 's/<body>//g' > ~/linux/content_temp.txt
rm content.txt
cat ~/linux/content_temp.txt | sed -re 's|</body>||g' > ~/linux/content.txt
rm content_temp.txt
CONTENT=$(grep -v "^[[:blank:]]*#" ~/linux/content.txt)
echo $CONTENT
else
echo "Content file not found"
fi

它只是删除文件并停止...它必须检查单词删除它们然后在最后我必须有一个清晰的content.txt文件,但我不是。你能让我知道为什么吗?

2 个答案:

答案 0 :(得分:2)

你也可以在一行中完成所有事情:

sed -ri -e 's/<\/?head>//g' -e 's/<\/?body>//g' content.txt
grep ...

答案 1 :(得分:1)

您没有以前一个命令成功为条件删除文件。

也许在这种情况下,值得探索set -e,以便脚本在第一个以非零返回码退出的命令中停止,可能与set -v一起显示正在运行的命令

话虽如此,如果您使用-i标志替换sed,则可以大大简化您的脚本。它在同一输入文件中进行替换,然后您不需要两个文件:

if [ -e ~/linux/content.txt ]
then
  sed -ri 's/<head>//g' ~/linux/content.txt
  sed -ri 's|</head>||g' ~/linux/content.txt
  sed -ri 's/<body>//g' ~/linux/content.txt
  sed -ri 's|</body>||g' ~/linux/content.txt
  CONTENT=$(grep -v "^[[:blank:]]*#" ~/linux/content.txt)
  echo $CONTENT
else
  echo "Content file not found"
fi

修改

此外,由于您正在对同一个文件进行所有修改,因此您可以在一个单独的sed调用中完成所有操作,如另一个答案所示,可以使用-e或仅使用一个sed命令在它自己的行:

file=~/linux/content.txt
if [ -e "$file" ]
then
  sed -r -i.bak -e 's/<head>//g
s|</head>||g
s/<body>//g
s|</body>||g
/^\s*$/d' "$file"
  cat "$file"
fi

请注意,sed不仅可以替换文本,还可以删除与某些模式匹配的行,例如:/^\s*$/d的空行,这样您就不再需要了你有grep调用。

另请注意sed行中的-i.bak。 sed的-i标志可以带一个参数,该参数将用作原始文件名的后缀以保留原始文件的副本,因此当您运行此文件时,您将留下一个名为的文件~/linux/content.txt.bak原始内容。当然,这只有在你只使用一个sed命令时才有意义,否则你的备份文件会在每个调用中被覆盖。