【问题标题】:How can I append spaces to the end of specific lines using regex如何使用正则表达式将空格附加到特定行的末尾
【发布时间】:2026-01-26 10:40:01
【问题描述】:

我有一个包含不同长度行的文本文件。我需要使这些统一,以便 PLSQL Developers 文本导入功能正确读取它们。长度为 89 个字符的行需要在末尾用 4 个空格填充。出于某种原因,sed 的 -i 参数也不被接受。

文件可以在here找到

我尝试了许多不同的正则表达式命令,这些命令是通过 Google 从各种来源找到的,但它们都不起作用,要么是因为“函数无法解析”,要么是它没有添加所需的空格。

我使用 Notepad++ 编写的代码是
查找:(^.{89})($)
替换:\1 \2

我尝试了许多 unix sed 命令,例如
sed -e "s/(^.{89})($)/\1 \2/" file.txt
sed -e "s/(^.{89})($)/\1\s\s\s\s\2/" file.txt
sed -e "s/(^.{89})($)/\1\ \ \ \ \2/" file.txt
sed -e "s/\(^.\{89\}\)\($\)/\1\ \ \ \ \2" file.txt
sed -e 's/\(^.\{89\}\)\($\)/\1[[:space:]]\2/g' file.txt
@987654327 @
sed -e 's/(^.{89})($)/\1[[:space:]]{4}\2/g' file.txt

【问题讨论】:

  • 您使用的是 Mac OS 吗?试试sed -i '' 's/^.\{89\}$/& /' file.txt& 后面有 4 个空格)。在 POSIX BRE 模式中,{m,n} 量词必须有转义大括号。如果-i 仍然不起作用,请使用sed 's/^.\{89\}$/& /' file.txt > newfile.txt
  • 最好放一些示例文本。
  • -i 选项“不被接受”是什么意思?不要将行尾$ 包含为($) 的捕获组。这是不必要的,也不会起作用。你试过sed -e "s/(^.{89})$/\1 /" file.txt吗?
  • @lurker 将 -i 传递给 sed 我得到“sed:非法选项 -- i”。我刚刚尝试了您的命令并收到“无法解析”错误。
  • 抱歉,我的建议有点草率。试试这个:sed -e "s/([^.]{89})$/\1 /" file.txt

标签: regex unix sed hp-ux


【解决方案1】:

这里的主要问题是您使用的是 BRE POSIX 语法,未转义的 ( / ) 被视为文字括号,未转义的 {/} 被视为文字大括号。

这应该可行:

sed 's/^.\{89\}$/&    /' file.txt > newfile.txt

这里:

  • ^ - 匹配行首
  • .\{89\} - 匹配任何 89 个字符
  • $ - 断言行尾位置。

替换中的&指的是整场比赛。

如果您需要使用-i 选项,请参阅sed edit file in place

【讨论】:

  • 感谢@Wiktor,但这只是输出相同的文本文件,没有在行中添加额外的空格。
  • @PaulWright 您的sed 版本是什么?操作系统?看,the sed command is working
  • 操作系统似乎是 HP-UX 11i 版本 3 Feb 2007。-V 命令无法显示 sed 的版本。
  • @PaulWright 我找不到有关它的任何详细信息。我想知道是否支持&。试试sed 's/^\(.\{89\}\)$/\1 /' file.txt > newfile.txt
  • 恐怕结果相同。我认为 HP-UX 不会有一个简单的解决方案。
【解决方案2】:

基于its manuals 的HP-UX 软件工具包:

sed 's/.*/    /' file | paste -d ' ' file - | cut -c 1-93 

它是如何工作的:

  1. 使用sed 创建一个行数与文件相同的虚拟流,但每行有四个空格。
  2. 使用paste 将虚拟流附加到文件 中的内容。 (因为 -d ' ' 它增加了 5 个 个空格,但这并不重要。)
  3. 使用cut 删除任何超过 93 字节的内容。

如果 HP-UX sed 比我想象的更不像 GNU sed,那么它可以被替换为类似的东西:

yes '    ' | head -n $(wc -l < file) | paste -d ' ' file - | cut -c 1-93 

【讨论】:

    【解决方案3】:

    试试这个:

    awk '{ <br>
     diff = 89 - length($0); <br>
     for(i=1;i<=diff; i++) <br>
     { <br>
       $0 = $0  "a" <br>
     } <br>
     print $0 <br>
    } <br>
    ' FileName.txt
    

    【讨论】:

      最近更新 更多