我需要在文件的开头添加一行。有问题的行是
\def\submit{}
我有一个使用的半工作解决方案sed
。我不知道sed
,但从网上的某个地方得到它,但它不能正常工作,因为它在行的开头插入了不需要的空格。虽然这并不重要,但我想我最好做得对。
sed -i '1i\ \\\def\\\submit{}' 'dirname/filename'
从我的阅读看来,所有这些额外的反斜杠都是逃离 shell 所必需的。也欢迎其他解决方案,但如果可能的话,我想要一个相对紧凑的内衬。谢谢。
这个问题,在 Linux 中通过终端使用 sed 在文件开头插入文本类似,但不能帮助我调试我的表达。
编辑:我已经接受了@Jonathan的回答,因为它解释了我以前的方法有什么问题。不过,我还添加了一个答案。
答案1
sed
用于编辑流——文件不是流。使用专门用于此目的的程序,例如ed
或ex
。该-i
选项sed
不仅不可移植,还会破坏文件的任何符号链接,因为它实际上会删除文件并重新创建它,这是毫无意义的。
ed -s [file] << EOF
0a
\\def\\submit{}
.
w
EOF
答案2
我现在无法访问 sed,所以我不完全确定这是正确的,但我认为您只需要删除第一个反斜杠及其后面的空格即可。
sed -i '1i\\\def\\\submit{}' 'dirname/filename'
尝试一下,看看是否有效。
答案3
我能够通过使用获得它的工作版本回答:“如何在多个文件的开头添加标签?”。
我之前并不知道这个问题。解决办法是:
sed -i '1s/^/\\\def\\\submit{}\n/' 'dirname/filename'
顺便说一句,我想:“如何在多个文件的开头添加标签?”这将是一个比这个问题链接到的“通过 Linux 终端使用 sed 在文件开头插入文本”更好的参考问题。它还有很多答案。
答案4
首先:转义反斜杠不是因为 shell - 字符串是单引号的。而是因为sed
它本身。
其次:克里斯·唐的回答有一些优点——不要用锤子代替螺丝刀。另一方面,可移植性和符号链接并不总是一个问题,如果是这样的话,两者
sed '1i\\\def\\submit{}'
和
sed '1i\\def\submit{}\'
应该做你需要的。我无法找出为什么后一种形式中的尾部反斜杠会关闭字符串中的转义,但它似乎是这样工作的,至少在 GNU 中sed
当命令放在命令行上时是这样。在脚本中使用时,似乎只有第一种形式有效(因为尾部反斜杠用于表示行尾,后面跟着另一个反斜杠):
#!/bin/sed -f
1i\
\\def\\submit{}