Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用sed替换给定行的第一列(未知浮点),然后用空格填充到第n个字符_Bash_Replace_Sed_Padding - Fatal编程技术网

Bash 如何使用sed替换给定行的第一列(未知浮点),然后用空格填充到第n个字符

Bash 如何使用sed替换给定行的第一列(未知浮点),然后用空格填充到第n个字符,bash,replace,sed,padding,Bash,Replace,Sed,Padding,我有一个文件,我希望通过脚本使用sed(或awk或类似工具)进行编辑 文件内容示例: 362.4318 str1 uag tj -19.275620800 string2 (blah) uag tt 367. randomtext uag tu 0.05699651698647584 blab*blah(something) ua

我有一个文件,我希望通过脚本使用sed(或awk或类似工具)进行编辑

文件内容示例:

    362.4318             str1                 uag tj
-19.275620800            string2 (blah)       uag tt
367.                     randomtext           uag tu
 0.05699651698647584     blab*blah(something) uag tv
    .008306              la*la(word)          uag tw
  54                     la*la(word)          uag tx
我有一个关联数组,其中包含要编辑的行号,还有一个包含要插入的新值。我基本上可以使用以下命令进行替换(尽管对于示例中的第6行,此操作失败,因为没有小数):

此外,字符串的未更改部分(第2列及以上)应始终从第26个字符开始(如果新值需要超过24个字符,则应在后面),即使它最初位于第26个字符的左侧。我读过一些关于填充的内容,但我不理解语法

非常感谢您的建议

您可以使用:

sed -i -r "${rowArray[$key]}s|^\s*-?[0-9.]+|${valueArray[$key]}|" file

  • 0-9
    也可以是
    [:数字:
  • [:blank://code>也可以仅为
    \t
使现代化 这可能适合您(GNU-sed&Bash):


然而,有些人可能会说eval是邪恶的

${rowArray[$key]}
${valueArray[$key]}
的值是多少?不是答案,但这个链接可能会帮助您使用填充语法-我发现它非常有用:@konsolebox例如,${rowArray[$key]}=4和${valueArray[$key]}=0。04793620056@user3719139好啊我的解决方案怎么样?@ValdarMoridin谢谢你的链接。这是我一直在想的参考资料之一。我最近自学成才,所以我永远不知道我所误解的是基本的还是复杂的:)快速分析让我相信这对替换有效,但不做任何填充。@user3719139您可以使用
printf
来做填充,例如
printf-v paddedValue“%”“${valueArray[$key]}”
并使用
$paddedValue
作为替换表单。我建议将
$paddedValue
格式化为在其后面包含空格,这样您可以统一替换列,而不影响其后列的对齐,并将
^\s*-?[0-9.]+
更改为
^\s*-?[0-9.]+\s*
,这样您也可以替换它后面的空格。我喜欢它!我来试试,把垫子钉上!太好了@用户3719139好的。如果您认为答案是您的解决方案,请接受。谢谢:)尚未使用eval。我会调查的。为什么是邪恶?:)
sed -i -r "${rowArray[$key]}s|^\s*-?[0-9.]+|${valueArray[$key]}|" file
sed -i "${rowArray[$key]}s|^[[:blank:]]*-\?[0-9.]\+|${valueArray[$key]}|" file
printf -v paddedValue '%24s ' "${valueArray[$key]}"
sed -i -r "${rowArray[$key]}s|^\s*-?[0-9.]+\s*|$paddedValue|" file
eval sed -i $'${rowArray[$key]}s/\S*/${valueArray[$key]}/'  $file