【问题标题】:Bash - sed multiple commands in single lineBash - sed 单行中的多个命令
【发布时间】:2018-08-28 09:08:31
【问题描述】:

玩 sed - 下面的命令可以满足需要,但一个衬里会更好。我尝试将前两个命令(使用分隔的';')组合起来以删除尾随的':',但没有成功。否则,只好删除最后一个 ':' 并写入一个新文件以执行下一个操作。

文件 'sys' 的单行包含可变数字字符和 ':' 分隔符。例如;

输入 - 'sys' 第一行 3.000000:50: 所需的输出,两个变量 thd=3 mem=50

thd=$(echo | sed 's/.......:.*//' < sys)
sed 's/:$//' < sys > sys1
mem=$(echo | sed 's|........:||' < sys1)

有没有办法结合前两个 sed 命令来避免写入第二个文件?我已经尝试了各种方法

类似这样的东西 - 编辑:这是删除尾随 ':' 的错误顺序

thd=$(echo | sed 's/:$//;s/.......:.*//' < sys)
mem=$(echo | sed 's|........:||' < sys1)

输出 3 50: 并附加分隔符。

编辑:这是正确的顺序并产生所需的输出。 Bash 不会将第一次操作的结果保存在 sys.sys 文件中。我应该在 3 班轮中选择它。

thd=$(echo | sed 's/.......:.*//' < sys)
mem=$(echo | sed 's|........:||;s/:$//' < sys)

【问题讨论】:

  • 请包含输入并完成所需的输出
  • 我已经修改了问题...

标签: bash sed


【解决方案1】:

如果您需要为两个变量独立赋值,第一个包含点之前的数字,第二个包含冒号之间的数字,您可以使用类似的方法

thd=$(cut -f1 -d. < sys)
mem=$(cut -f2 -d: < sys)

也可以同时分配两者:

read thd mem < <(tr "." ":" < sys | cut -f1,3 -d: --output-delimiter=" ")

【讨论】:

  • 剪辑版非常理想。只有几个字符。
  • 读取版本需要tr -d 选项。仍然无法让它在我的系统上运行。
  • 如果您使用tr-d 选项,您将删除分隔符并丢失正确分隔字段所需的信息。
  • 正如你所说的 -d 不起作用 - 如果乐意接受尾随的 .000000,这对 read thd mem &lt; &lt;(cut -f1,2 -d: --output-delimiter=" " &lt; sys) 起作用,这对我的应用程序没有影响 - 不需要 tr 选项在那种情况下。
【解决方案2】:

试试这个:

$ echo '3.000000:50:' | { IFS='.:' read thd x mem; echo "'$thd' '$mem'"; }
'3' '50'

或者这个:

$ sys='3.000000:50:'; IFS='.:' read thd x mem <<< "$sys"; echo "'$thd' '$mem'"
'3' '50'

上面设置了“dont care”变量x。如果你不喜欢这样,你可以分配两次mem

$ sys='3.000000:50:'; IFS='.:' read thd mem mem <<< "$sys"; echo "'$thd' '$mem'"
'3' '50'

【讨论】:

  • 读取文件sys 类似$ { IFS='.:' read thd x mem; echo "'$thd' '$mem'"; } &lt; sys 的文件,我发现要读取多个字段更加困难。
  • read 的优势在于,它不需要两个子 shell 和两个 cut 调用。
  • 我玩过这个 '{ IFS='.:' read thd x mem x img x cal; echo "'$thd' '$mem' '$img' '$cal' "; }
  • 应该是{ IFS='.:' read thd x mem x img x cal; echo "'$thd' '$mem' '$img' '$cal' "; } &lt; sys 无关变量如何工作?
  • 当您使用IFS='.:' 拆分时,您会得到三个令牌:3、000000 和 50。每个令牌都存储在一个变量中:thd=3x=000000mem=50。您必须将零存储在某处,尽管您不需要它们。您也可以在read 之后执行unset x。或者您可以分配mem 两次。首先是零,然后是 50。
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多