Shell 用给定文本行中的货币格式替换所有数字
我想写一个Shell(AWK,Sed也可以)程序,将一行文本作为输入 其中包含任意排列的整数字符串。e、 g “12884和111933是两个数字,323232也是一个数字” 我希望输出是 “12884和1,11933是两个数字,2,23232也是一个数字” 如果这是PHP,一个简单的preg_replace_回调就可以达到这个目的,但我希望它在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
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:对于那些可能不熟悉的人,这个问题中逗号的位置在印度是正确的(它们不是拼写错误)。看,是的,它们不是打字错误。