Shell 如何在文件中替换sed脚本?

Shell 如何在文件中替换sed脚本?,shell,sed,Shell,Sed,上面的脚本从CSV中删除第二个字段,并清除引号等。我没有包括大部分脚本,因为它与问题无关 脚本保存在文件fix.sh中 我可以在这样的文件上运行它: #!/bin/sed -f s/","/|/g; # global change of "," to bar # do some more stuff #s/|/","/g; # global change of bar back to "," #---end of script-

上面的脚本从CSV中删除第二个字段,并清除引号等。我没有包括大部分脚本,因为它与问题无关

脚本保存在文件
fix.sh

我可以在这样的文件上运行它:

#!/bin/sed -f
s/","/|/g;                  # global change of "," to bar
# do some more stuff
#s/|/","/g;                  # global change of bar back to ","
#---end of script---
#!/bin/sed -nf
# adapted from http://www.linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq4_005.html
s/","/|/g;                  # global change of "," to bar
s/^"//;
s/"$//;
s/^\([^|]*\)|[^|]*|/\1|/;   # delete 2nd field contents
s/||/|/;                        # change || to |
s/ //g;                         # remove spaces
s/|/,/g;
#s/|/","/g;                  # global change of bar back to ","
#---end of script---
我试图找到一些关于
sed
bash脚本的文档,但没有找到任何帮助

我相信答案很简单,我就是找不到。谢谢你的帮助

编辑:我应该提到这是在CentOS 6机器上运行的

完整的脚本如下。其总体结果是删除字段#2和带引号

$ ./fix.sh myfile.txt

如果您的
sed
支持
-i
选项,则可以如下方式运行脚本:

#!/bin/sed -f
s/","/|/g;                  # global change of "," to bar
# do some more stuff
#s/|/","/g;                  # global change of bar back to ","
#---end of script---
#!/bin/sed -nf
# adapted from http://www.linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq4_005.html
s/","/|/g;                  # global change of "," to bar
s/^"//;
s/"$//;
s/^\([^|]*\)|[^|]*|/\1|/;   # delete 2nd field contents
s/||/|/;                        # change || to |
s/ //g;                         # remove spaces
s/|/,/g;
#s/|/","/g;                  # global change of bar back to ","
#---end of script---
-i
sed的选项执行文件内替换

如果您的
sed
版本不支持
-i
选项,那么您可以执行与
-i
幕后操作几乎相同的操作:

./fix.sh -i myfile.txt
为什么重定向到同一个文件不起作用?
原因是重定向会打开文件进行写入,并最终清除任何现有内容
sed
然后尝试读取此空文件,但不执行任何操作。然后关闭该文件,您将得到一个空文件。

我在命令行中使用
-I
,它可以工作。但在脚本中使用它会给我一个空文件。你的第二个解决方案也给了我一个空文件。这与我的脚本头有关吗?@ButtleButkus:这个答案似乎是正确的+1,但是由于脚本中的其他命令,您可能会得到空文件。我建议您在问题中发布完整脚本,以便我们进行调查。请注意,Mac OS X上的
sed
接受
-I
,但需要文件备份的扩展名,这与GNU
sed
不同。如果您使用的是Mac OS X,这可能是您的问题的一个因素。运行命令时是否删除了I/O重定向?这可能是另一个问题。谢谢Jon和Anubhava,这两个观点都是正确的和好的@ButtleButkus您需要使用脚本更新问题以进行适当的调试。您可以尝试在脚本中一次添加一个sed命令,并对文件运行它。生成空文件的命令将是需要调整的命令。@ButtleButkus您在支持打印操作的第一行中使用的
-n
。Put
ps/|/,/g行(就在注释之前)。这将启用打印操作。
./fix.sh myfile.txt > temp && mv temp myfile.txt