如何在 UNIX 中查找和替换字段列值

如何在 UNIX 中查找和替换字段列值

我有一个文件,其值是用以下分隔的|

123-|aaa|bbb|123|123.0|123-|123.01-|-123.02|123.03-|aaa|bbb|123-|aaa-|-bbb|cc-cc|123.04-|aa123-|123.05-

我需要选择以 结尾的列值-,选择的列应该是数值,然后将 移动-到该值的开头。

答案1

POSIXly:

sed ':1
     s/^\(.*|\)\{0,1\}\([0-9.]*[0-9][0-9.]*\)-\(|.*\)\{0,1\}$/\1-\2\3/
     t1'

或者以 awk更直观的方式:

awk -F '|' -v 'OFS=|' '{
  for (i = 1; i <= NF; i++)
    if ($i ~ /^[0-9]*(\.[0-9]+)?-$/)
      $i = "-" substr($i, 1, length($i)-1)
  print}'

(该版本更为严格,被认为是数字,例如,该sed人会接受作为数字)。1...2

根据您的输入,给出:

-123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05

答案2

您可以通过将匹配锚定到行的开头或分隔符来完成此操作。例如,使用 GNU sed 扩展正则表达式:

sed -r ':a; s/(^|\|)([0-9.]+)-(\||$)/\1-\2\3/; ta' infile

输出:

-123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05

相关内容