Cat文件执行一些操作从文件输出追加到第一个文件

时间:2017-12-08 14:56:52

标签: linux bash cat

我试图实现以下目标:

  #!/bin/bash
  if [ -f file2 ]; then

  cat file2 > file1
  sed -i 's#some operation' file1
  cat file3 >> file1

  exit 0

  elif [ ! -f file2 ]; then

  cat file1 > file2
  sed -i 's#some operation' file1
  cat file3 >> file1

  exit 0

  else

  echo "something"
  exit 1

  fi

任何想法如何更简单? 没有使用那么多猫和文件?

谢谢!

2 个答案:

答案 0 :(得分:2)

原始问题:

cat file1 > file1.bak
sed -i 's# some operation' file1.bak
cat file2 >> file1.bak
echo -n > file1
cat file1.bak > file1
rm -f file1.bak

更简单的答案是(正如我在评论中所说):

sed -i 's# some operation' file1
cat file2 >> file1

对于编辑过的问题 - 更多解释。

在您的情况下:

#!/bin/bash
if [ -f file2 ]; then
...
elif [ ! -f file2 ]; then
...
else
...
fi

else永远不会发生。 如果file1存在并且是常规文件。 if-then将会运行,如果您否定上述内容,则会运行elif-then。例如。你可以将它简化为

if [ -f file2 ]; then
...
else
...
fi

现在采取行动:

在:

cat file2 > file1
sed -i 's#some operation' file1
cat file3 >> file1

与:

相同
sed 's#some operation' <file2 >file1
cat file3 >> file1

和:

cat file1 > file2
sed -i 's#some operation' file1
cat file3 >> file1

没问题 - 您正在创建file1file2的备份(副本)。这也可以写成cp file1 file2

比较这两个部分,你们都做同样的事情:

cat file3 >> file1

所以,DRY(不要重复自己) - 并在if后执行此操作,因为这两个部分都很常见。

所以,我们得到:

if [ -f file2 ]; then
    sed 's#some operation' <file2 >file1
else
    cp file1 file2  #make the copy
    sed -i 's#some operation' file1
fi
cat file3 >> file1

另外,

sed 's#some operation' <file2 >file1
#and
sed -i 's#some operation' file1

非常相似 - 例如sed操作的结果始终进入file1。此外,在else您将file1复制到file2以便

cat file1 > file2
sed -i 's#some operation' file1

也可以写成

cp file1 file2
sed 's#some operation' <file2 >file1

我们得到了两个案例的缩进sed命令,所以 - 再次干。

if [ -f file2 ]; then
    : #do nothing here...
else
    cp file1 file2  #make the copy
fi
sed 's#some operation' <file2 >file1
cat file3 >> file1

do nothing部分是不必要的,所以我们得到了:

if [ ! -f file2 ]; then
    cp file1 file2  #make the copy
fi
sed 's#some operation' <file2 >file1
cat file3 >> file1

这可以使用[[ condition ]] && ...缩短,但现在不需要。 :)

也可以非常更精确地命名您的文件。 file1等等 - 告诉你内容。

答案 1 :(得分:0)

x = 3

def fn():
    var = 'x'
    g = globals()
    if var in g: del g[var]

print(x)
fn()
print(x) #NameError: name 'x' is not defined