GNU shell 在一个嵌套的 diff 中一次做多件事
GNU shell doing multiple things in a nested diff all at once
我试图在一行中做一些事情,这是我的尝试:
coolc -P p good.cool | xargs -I {} sh -c "diff <(sed 's/@[0-9]+/@/g' {}) <(sed 's/@[0-9]+/@/g' good.out)"
- 我有一个名为
good.out
的文件,我想在其上 运行 sed
:sed 's/@[0-9]+/@/g' good.out
- 我想 运行
coolc -P p good.cool
将结果打印到标准输出
- 我想在
sed 's/@[0-9]+/@/g' {}
中使用 (2) 的输出
- 我想
diff
(1) 和 (3)
是否可以在不创建新文件的情况下在一行中完成所有这些操作?
当然可以对此进行优化(运行宁sed
一遍又一遍地在同一个good.out
文件上不是很有效),但是尽可能短的翻译将您的代码转换为有效的东西(编写时假设 实际上有一个很好的理由使用 xargs):
#!/usr/bin/env bash
while IFS= read -r filename; do
diff <(sed 's/@[0-9]+/@/g' "$filename") \
<(sed 's/@[0-9]+/@/g' good.out)
done < <(coolc -P p good.cool)
bash
,而不是 sh
,需要使用 process substitution 语法才可用。
- 只要
coolc -P p good.cool | xargs ...
的目的是 运行 ...
每个项目写入 coolc -P p good.cool
的标准输出一次,最好用 BashFAQ #1 while read
循环.
- BashFAQ #24: 我在管道中的循环中设置了变量。为什么它们在循环终止后就消失了?或者,为什么我不能通过管道读取数据?——这解释了为什么使用
<( )
来提供 while read
循环而不是管道。
假设原代码使用xargs是错误的,而你真的只想运行 diff
一次:
diff <(coolc -P p good.cool | sed 's/@[0-9]+/@/g') \
<(sed 's/@[0-9]+/@/g' good.out)
我试图在一行中做一些事情,这是我的尝试:
coolc -P p good.cool | xargs -I {} sh -c "diff <(sed 's/@[0-9]+/@/g' {}) <(sed 's/@[0-9]+/@/g' good.out)"
- 我有一个名为
good.out
的文件,我想在其上 运行sed
:sed 's/@[0-9]+/@/g' good.out
- 我想 运行
coolc -P p good.cool
将结果打印到标准输出 - 我想在
sed 's/@[0-9]+/@/g' {}
中使用 (2) 的输出
- 我想
diff
(1) 和 (3)
是否可以在不创建新文件的情况下在一行中完成所有这些操作?
当然可以对此进行优化(运行宁sed
一遍又一遍地在同一个good.out
文件上不是很有效),但是尽可能短的翻译将您的代码转换为有效的东西(编写时假设 实际上有一个很好的理由使用 xargs):
#!/usr/bin/env bash
while IFS= read -r filename; do
diff <(sed 's/@[0-9]+/@/g' "$filename") \
<(sed 's/@[0-9]+/@/g' good.out)
done < <(coolc -P p good.cool)
bash
,而不是sh
,需要使用 process substitution 语法才可用。- 只要
coolc -P p good.cool | xargs ...
的目的是 运行...
每个项目写入coolc -P p good.cool
的标准输出一次,最好用 BashFAQ #1while read
循环. - BashFAQ #24: 我在管道中的循环中设置了变量。为什么它们在循环终止后就消失了?或者,为什么我不能通过管道读取数据?——这解释了为什么使用
<( )
来提供while read
循环而不是管道。
假设原代码使用xargs是错误的,而你真的只想运行 diff
一次:
diff <(coolc -P p good.cool | sed 's/@[0-9]+/@/g') \
<(sed 's/@[0-9]+/@/g' good.out)