如何使用正则表达式将空格附加到特定行的末尾

时间:2019-01-14 11:15:04

标签: regex unix sed hp-ux

我有一个文本文件,其中包含不同长度的行。我需要使它们统一,以便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
sed -e 's/\(^.\{89\}\)\($\)/\1[[:space:]]\{4\}\2/g' file.txt
sed -e 's/(^.{89})($)/\1[[:space:]]{4}\2/g' file.txt

3 个答案:

答案 0 :(得分:0)

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

这应该有效:

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

这里:

  • ^-匹配一行的开头
  • .\{89\}-匹配任何89个字符
  • $-声明行的结尾。

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

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

答案 1 :(得分:0)

尝试一下:

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

答案 2 :(得分:0)

基于its manuals的,适用于HP-UX的软件工具:

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

工作原理:

  1. 使用sed创建一个虚拟流,该虚拟流的行数与 file 相同,但每行有四个空格。
  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