Shell 用给定文本行中的货币格式替换所有数字

Shell 用给定文本行中的货币格式替换所有数字,shell,string,sed,awk,number-formatting,Shell,String,Sed,Awk,Number Formatting,我想写一个Shell(AWK,Sed也可以)程序,将一行文本作为输入 其中包含任意排列的整数字符串。e、 g “12884和111933是两个数字,323232也是一个数字” 我希望输出是 “12884和1,11933是两个数字,2,23232也是一个数字” 如果这是PHP,一个简单的preg_replace_回调就可以达到这个目的,但我希望它在shell中:/ 任何指点都会大有帮助 for line in $(echo "12884 and 111933 are two numbers and

我想写一个Shell(AWK,Sed也可以)程序,将一行文本作为输入

其中包含任意排列的整数字符串。e、 g

“12884和111933是两个数字,323232也是一个数字”

我希望输出是

“12884和1,11933是两个数字,2,23232也是一个数字”

如果这是PHP,一个简单的preg_replace_回调就可以达到这个目的,但我希望它在shell中:/

任何指点都会大有帮助

for line in $(echo "12884 and 111933 are two numbers and 323232 is also a number" 
    | tr ' ' '\n');
    do 
        if [ $line -eq $line 2> /dev/null ]; 
            then printf "%'d\n" $line;
        else 
            echo $line; 
        fi; 
    done | tr '\n' ' '
我知道这可能是漫长和丑陋的,但现在是我所能做的最好的,我希望这会有所帮助

如下解释:

  • 首先,我把线分成多行,这样我就可以循环并识别哪些字符串是数字,哪些不是数字
  • 然后我测试当前字符串是否为数字
  • 如果它是一个数字,我将使用printf进行解析
  • 如果不是,我只是随声附和,原封不动地离开

  • 完成循环并将所有内容放回一行

    • 无需使用
      tr
      拆分线路。您可以使用Bash的分词功能:

      line="12884 and 111933 are two numbers and 323232 is also a number"
      for word in $line
      do
          if [[ $word = *[^0-9]* ]]
          then
              printf "%s " $word
          else
              printf "%'d " $word
          fi
      done
      

      我还使用globbing来测试数字序列,而不是依赖于产生错误的东西,这取决于它是否是整数。

      “完成循环并将所有内容放回一行”我认为在我的情况下,这个ie做得不正确。我在输出行中打印了“\n”我的解决方案确实有点混乱,我只在一行中使用了它,并且按照预期工作,@Dennis Williamson的更清晰。我不知道分词功能,谢谢你指出这一点+1.我认为您必须在if测试条件下更正$foo var:对于那些可能不熟悉的人,这个问题中逗号的位置在印度是正确的(它们不是拼写错误)。看,是的,它们不是打字错误。