2016-11-08 52 views
2

我在bash脚本中使用sed来更改某些变量值。这些变量是不同类型的混合物,还包括一些特殊字符:sed找不到文件

sed -i -e "s/NPROC=[^,]*,/NPROC=$NPROC/" \ 
     -e "s/NFRPOS=[^,]*,/NFRPOS=$OUTPUTFREQ/" \ 
     -e "s/NFRHIS=[^,]*,/NFRHIS=$OUTPUTFREQ/" \ 
     -e "s/COSP_OUTPUT_FREQUENCY=[^,]*,/COSP_OUTPUT_FREQUENCY=$OUTPUTFREQ/" \ 
     -e "s/TSTEP=[^,]*,/TSTEP=$TSTEP/" \ 
     -e "s/NCEXTR=[^,]*,/NCEXTR=$NCEXTR/" \ 
     -e "s/NVXTR2=[^,]*,/NVXTR2=$NVXTR2/" \ 
     -e "s/NVEXTR=[^,]*,/NVEXTR=$NVEXTR/" \ 
     -e "s/COSP_NLEVELS=[^,]*,/COSP_NLEVELS=$NLEV/" \ 
     -e "s/NVEXTRAGB=[^,]*,/$NVEXTRAGB/" \ 
     -e "s/NVEXTR2GB=[^,]*,/$NVEXTR2GB/" \ 
     -e "s/NFPLEV=[^,]*,/NFPLEV=$NFPLEV/" \ 
     -e "s/CNMEXP=[^,]*,/CNMEXP=\"${EXPID}\"/" \ 
     -e "s/LFPOS=[^,]*,/NFPOS=2/" \ 
     -e "s/NLAT=[^,]*,/NLAT=$NLAT/" \ 
     -e "s/NLON=[^,]*,/NLON=$NLON/" \ 
     $NAMELIST 


+ sed -i -e 's/NPROC=[^,]*,/NPROC=10/' ' ' 
sed: can't read : No such file or directory 

不过,我不断收到该文件$ NAMELIST不能被发现的错误。该文件确实存在于相同的目录中,并且名称中没有错误。添加完整路径也无济于事。所以我想知道这个sed命令有什么问题。

+0

原始错误'$ NAMELIST无法找到'在哪里?新的错误很容易理解。你可能有一个额外的错误'/ path/to/namelist:Permission denied'。 – alvits

+0

错误是在续行后添加了一个空格。 – Shejo284

回答

3

第一个反斜杠后面有一个空格。不是转义换行来继续执行命令,而是转义空间,所以它认为要编辑的文件的名称是一个空格。

确保反斜杠是每一行上的最后一个字符。

+0

这是问题所在。谢谢:-)很难注意到一个空的空间。 – Shejo284

+1

您可以使用文本编辑器自动删除行中的尾部空格,或至少显示不可见的字符(如空格)。无论如何,我个人并不喜欢延续线,正是因为这类问题。 – user1934428

+0

好点。我在终端模式下使用emacs,所以我没有看到问题。另外,在这种情况下,人们必须知道空间会导致这样的错误。目前尚不清楚这种良性可能会导致这样的问题。 – Shejo284

0

无论出于何种原因,您的NAMELIST变量未被扩展。 Sed正在寻找名为“$ NAMELIST”而不是“/the/path/to/namelist.txt”的文件...

检查设置NAMELIST变量的逻辑。

+0

将完整路径添加到文件并使名称明确无助。我是新来的sed,所以我怀疑我错过了命令中的某些东西。 – Shejo284

0

另一种解释是,NAMELIST字面上包含短语“无法读取”。惠普:

$ NAMELIST="can't read " 
$ sed -e 1d "$NAMELIST" 
sed: can't read : No such file or directory 

你是如何设置NAMELIST

+0

呵呵......我在Bash编码方面并没有那么糟糕。名称列表= namelist.t255。 – Shejo284