使用SED在文件1-15行末尾添加指定文本时出现错误的技术求助
你遇到的错误是因为sed命令的语法写错啦——你把p打印命令和s替换命令直接凑在一起了,sed没法识别这种写法,所以才会报“extra characters after command”的错误。
先给你正确的命令(最简洁的写法)
要给1-15行末尾添加cd directory2/,同时保留所有其他行,直接用这个命令就行:
sed '1,15 s/$/ cd directory2\//' myfile
如果要直接修改原文件(而不是只输出到终端),可以加-i选项:
- GNU sed(Linux系统):
sed -i '1,15 s/$/ cd directory2\//' myfile - BSD sed(比如macOS):
sed -i '' '1,15 s/$/ cd directory2\//' myfile
为什么你的原命令出错?
你的命令sed -ni '1,15p s/$/\ cd\ available\//g' myfile有两个核心问题:
- 命令语法错误:
1,15p是一个独立的打印命令,后面不能直接跟s/.../.../g替换命令,sed会把这当成一个命令的多余字符。如果一定要用-n选项,得把命令用分号分隔或者大括号包裹,写法会复杂很多。 - 没必要用
-n和p:-n会抑制sed的默认输出(也就是不自动打印每行),而你需要保留16行及以后的内容,用默认输出反而更简单——只对1-15行执行替换,其他行自动输出即可。
更简洁的写法(避免转义斜杠)
如果觉得转义/麻烦,可以换个分隔符(比如#),这样不需要转义,可读性更高:
sed '1,15 s#$# cd directory2/#' myfile
验证效果
用你给出的示例输入:
mget -p directory1/file1.csv
mget -p directory1/file2.csv
mget -p directory1/file3.csv
mget -p directory1/file4.txt
mget -p directory4/fileab.csv
mget -p directory4/fileabc.txt
执行命令后会得到你想要的输出:
mget -p directory1/file1.csv cd directory2/
mget -p directory1/file2.csv cd directory2/
mget -p directory1/file3.csv cd directory2/
mget -p directory1/file4.txt cd directory2/
mget -p directory4/fileab.csv
mget -p directory4/fileabc.txt
所有16行及以后的内容也会完整保留,不会丢失。
内容的提问来源于stack exchange,提问作者Federico Martin Berbara

