我有这种文本:
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。第二行现在成为第一行,过程重复。