【问题标题】:Redirecting files from a directory using awk使用 awk 从目录重定向文件
【发布时间】:2016-08-20 00:23:06
【问题描述】:

我正在为目录中的每个文本文件运行一个 awk 命令。截至目前,它显示到标准输出。我希望它将这些更改保存到实际文件本身。我的命令是

awk{ORS=(/^\- **\ **/?"":RS)}1 *.txt >> *.txt

每次我重定向命令时,它都会将所有内容保存到一个文件中。无论如何我可以将更改保存回文件本身吗?

【问题讨论】:

  • 这是一个 shell 问题,因此请更新您的标签以显示您正在使用的任何 shell。 >> 表示 append。你是这个意思还是你真的想要>,意思是overwrite?另外,您使用的是什么版本的 awk,是否有可用的 GNU awk (awk --version)?

标签: awk


【解决方案1】:

-s 和空格不是括号表达式之外的正则表达式元字符,因此无需在正则表达式中转义它们。不过,您确实需要将脚本括在单引号分隔符中。这将完成您的脚本显然试图做的事情:

awk '{ORS=(/^-  ** **/?"":RS)}1'

您不能写入正在阅读的同一个文件。如果您尝试使用任何命令(awk、sed、grep 等)执行此操作:

command file > file

然后shell可以做它喜欢的任何事情,包括在command file之前执行> file,然后在你的命令打开它之前清空文件。

用 GNU awk 4.* 覆盖输入文件是:

awk -i inplace '{ORS=(/^-  ** **/?"":RS)}1' *.txt

对于其他 awk,您需要类似以下内容:

for file in *.txt; do
    awk '{ORS=(/^-  ** **/?"":RS)}1' "$file" > tmp && mv tmp "$file"
done

【讨论】:

  • for 循环有效,但现在每个文件的空白行空间已被删除,为每个文件提供了一大块数据。它似乎试图将所有内容放在一行中。
  • awk 脚本执行您编写的操作,添加输出重定向根本不会改变这一点。如果它正在做您不希望它做的事情,那么在一个文件上对其进行测试并修复它以执行您想要它做的事情。例如,如果您希望按字面意思对待 *s,您可能希望转义其中的 *s。
猜你喜欢
  • 2019-04-30
  • 2011-05-16
  • 2015-08-20
  • 2016-03-04
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
相关资源
最近更新 更多