【问题标题】:How to ensure file written with sed w command is closed如何确保使用 sed w 命令写入的文件已关闭
【发布时间】:2014-07-28 03:15:11
【问题描述】:

我正在使用 sed 'w' 命令从 TeX 文档中获取标签:

/\\label{[a-zA-Z0-9]*}/w labels.list

这个脚本是管道的一部分,稍后,awk 会在管道中读取 sed 刚刚写入的文件。例如

cat bob | sed -f sedScript | awk -f awkScript labels.list -

管道有时会产生正确的输出,有时则不会(对于完全相同的输入文件“bob”)。这是随机的。

我只能得出结论,有时 awk 会在 sed 正确关闭文件之前尝试读取文件。无论如何我可以强制 sed 在脚本末尾关闭文件,或者关于问题可能是什么的任何其他建议?

【问题讨论】:

  • 发布您的输入数据以及您希望从中得到什么。这一切都可以通过一个awk 命令来完成。 PS 不要将catsedawk 和其他可以自行读取数据的程序一起使用。
  • 敢说我可以在 awk 中完成这一切,但 sed 在某些事情上更容易。我正在尝试将一些人前 LaTeX 时代的 TeX 文件转换为标准的 LaTeX。这是一项艰巨的工作,所以很遗憾发布我的意见无济于事。

标签: shell sed


【解决方案1】:

管道中的所有阶段并行运行。这是管道的一个极其重要和定义性的特征,您可以或不应该尝试做任何事情来防止或规避它。

相反,您应该重写您的脚本,以便所有数据依赖项都按照您需要的顺序执行和完成。在一般情况下,您会这样做

cat bob | sed -f sedScript > tempfile
cat tempfile | awk -f awkScript labels.list -

或在您的情况下等效:

grep '\\label{[a-zA-Z0-9]*}' bob > labels.list
awk -f awkScript labels.list bob

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 2021-11-03
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多