2
#!/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

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

$ ./fix.sh <myfile.txt >outputfile.txt

而且效果很好。

但我希望它在文件中替换。这不起作用:

$ ./fix.sh <myfile.txt >myfile.txt

结果是空的myfile.txt

这也不起作用:

$ ./fix.sh myfile.txt

我试图找到一些关于sedbash 脚本的文档,但没有找到任何帮助我的东西。

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

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

完整的脚本如下。其总体结果是删除 field#2 并去除引号。

#!/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---
4

1 回答 1

2

如果您的sed支持-i选项,那么您可以像这样运行您的脚本:

./fix.sh -i myfile.txt

-i的选项进行sed文件内替换。

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

./fix.sh myfile.txt > temp && mv temp myfile.txt

为什么重定向到同一个文件不起作用?

原因是重定向打开文件进行写入并最终清除所有现有内容。sed然后尝试读取这个空文件,并且什么都不做。然后关闭该文件,然后您会得到一个空文件。

于 2013-07-17T03:59:59.710 回答