替代文字



我有这种文本:

0
4.496
4.496
Plain text.
7.186
Plain text
10.949
Plain text
12.988
Plain text
16.11
Plain text
17.569
Plain text
ESP:
Plain text

我试图进行sed替换,因为我需要在数字之后对齐,类似于:

0
4.496
4.496 Plain text.
7.186 Plain text
10.949 Plain text
12.988 Plain text
16.11 Plain text
17.569 Plain text ESP:Plain text

,但是我正在尝试使用sed的不同命令组合,但我无法保留匹配模式的一部分

sed -r 's/([0-9]+.[0-9]*)s*/1/g'

我正在尝试在数字后删除所有n并对齐文本,但它不起作用。我也需要将文本与文本对齐。

我也尝试过:

sed -r 's/n*//g'

但没有结果。

谢谢

这有点棘手。您的方法不起作用,因为SED以基于行的方式运行(它读取一条行,运行代码,读取另一行,运行代码等等),因此除非您做特殊的事情,否则它不会看到Newlines。我们必须完全覆盖SED的正常控制流。

与gnu sed:

sed ':a $!{ N; /n[0-9]/ { P; s/.*n//; }; s/n/ /; ba }' filename

这起作用如下:

:a                # Jump label for looping (we'll build our own loop, with
                  # black jack and...nevermind)
$! {              # Unless the end of the input was reached:
  N               # fetch another line, append it to what we already have
  /n[0-9]/ {     # if the new line begins with a number (if the pattern space
                  # contains a newline followed by a number)
    P             # print everything up to the newline
    s/.*n//      # remove everything before the newline
  }
  s/n/ /         # remove the newline if it is still there
  ba              # go to a (loop)
}
                  # After the end of the input we drop off here and implicitly
                  # print the last line.

该代码可以适用于与BSD SED一起使用(如 *BSD和Mac OS X上找到),但是BSD SED在标签和跳跃指令上有点挑剔。我相信

sed -e ':a' -e '$!{ N; /n[0-9]/ { P; s/.*n//; }; s/n/ /; ba' -e '}' filename

应该工作。

此gnu-awk命令也可以处理以下操作:

awk -v RS= 'BEGIN{ FPAT="(^|n)[0-9]+(\.[0-9]+)?(n[^0-9][^n]*)*" }
   {for (i=1; i<=NF; i++) {f=$i; sub(/^n/, "", f); gsub(/n/, " ", f); print f}}' file
0
4.496
4.496 Plain text.
7.186 Plain text
10.949 Plain text
12.988 Plain text
16.11 Plain text
17.569 Plain text ESP: Plain text
sed -n '1h;1!H;$!b
         x;s/n([^0-9])/ 1/gp' YourFile
  • -n:仅在需求时打印
  • '1h;1!H;$!b;x将整个文件加载到缓冲区中,直到结束(最后整个文件都在工作缓冲区中)
  • s/n([^0-9])/ 1/gp:替换所有新线路,然后用空格字符打印结果。

这可能对您有用(gnu sed):

sed ':a;N;s/n([[:alpha:]])/ 1/;ta;P;D' file

一次处理两行。如果第二行以字母字符开头,请删除先前的newline并附加另一行并重复。如果第二行不以字母字符开头,请打印然后删除第一行及其newline。第二行现在成为第一行,过程重复。

相关内容

  • 没有找到相关文章

最新更新