Windows 使用gawk和/或sed使用十六进制表示法搜索不可打印字符

Windows 使用gawk和/或sed使用十六进制表示法搜索不可打印字符,windows,awk,sed,hex,gawk,Windows,Awk,Sed,Hex,Gawk,在Windows命令行中,我试图修复某些字段中出现的由“|”分隔的虚线。在某些业务系统中,自由文本字段允许用户输入return,在提取事务时,这些字段有时会打断记录行 我有来自和的GAWK(GNU Awk 3.1.0)和SED(GNU SED版本4.2.1)。我的数据如下: smith|Login|command line is my friend|2 oliver|Login|I have no idea why I am here|10 dennis|Payroll|are we ther

在Windows命令行中,我试图修复某些字段中出现的由“|”分隔的虚线。在某些业务系统中,自由文本字段允许用户输入return,在提取事务时,这些字段有时会打断记录行

我有来自和的GAWK(GNU Awk 3.1.0)和SED(GNU SED版本4.2.1)。我的数据如下:

smith|Login|command line is my friend|2
oliver|Login|I have no idea 
why I am here|10
dennis|Payroll|are we there yet?|100
smith|Time|going to have some fun|200
smith|Logout|here I come|10
第二行因第一段解释的原因而中断。虚线2末尾的返回是一个常规的Windows返回,看起来像十六进制编辑器中的x0D x0A

在删除sed或gawk而不是/n或/r类型的符号时,我希望能够使用十六进制值(不止一个)来增加灵活性。只有当它出现在第三列时,代码才应该能够用某些东西替换它。只能使用sed或(x)awk。对于gawk“sed样式”,如果可能的话,替换(使用-i参数)方法会很有帮助

尝试了以下操作,但未捕获任何内容:

gawk -F "|" "$3 ~ /\x0D\x0A/" data.txt
也试着用

gawk -F "|" "{gsub(/\x0d\x0a/, \x20, $3); print }" OFS="|" data.txt


(能够用sed捕获x20(空格),但没有返回的机会)

不完全清楚您想做什么(为什么要用空白字符替换行尾??),但这可能会让您走上正确的道路:

awk -v RS='\r\n' -v ORS=' ' '1' file
如果您想进行就地编辑,只需在前面添加
-i inplace

这些都是仅用于就地编辑和多字符的gawk。您可能还需要添加
-v BINMODE=3
(也仅适用于gawk),这取决于您运行的平台,以在gawk看到底层C原语之前阻止它们剥离
\r

等一下,我看到你使用的是gawk 3.1.0-已经过期5年多了,升级你的gawk版本以获得最新的bug修复和功能(包括-I in place)

等等2-你真的想用一个空白字符替换记录中的换行符吗?这更简单:

awk 'BEGIN{RS=ORS="\r\n"} {gsub(/\n/," ")} 1' file
例如(在
\n
之前添加了一个
\s*
,因为您的输入后面有空白,我想您也希望删除该空白):

或者在输出中使用UNIX行结尾而不是DOS,只是不要设置ORS:

$ awk 'BEGIN{RS="\r\n"} {gsub(/\s*\n/," ")} 1' file | cat -v
smith|Login|command line is my friend|2
oliver|Login|I have no idea why I am here|10
dennis|Payroll|are we there yet?|100
smith|Time|going to have some fun|200
smith|Logout|here I come|10

谢谢你的解释-我并不是在试图摆脱所有的回报,但唯一一个打破了第三个字段中“想法”一词后的第二行。如前所述,我使用的是仅可用的windows预编译开源软件。为这个问题添加了现实世界案例。如前所述,我不想使用/n/r我只想使用不可打印字符的十六进制符号。好的,那么不要使用\r\n,使用适合您的字符。所以,在其他字段中也有换行符,但您想将它们保留为换行符吗?如果是这样,那么在你的例子中包括它,如果不是,那么不要担心它。安装一个新版本的上述预编译开源软件,或者更好的是获得cygwin并运行最新的gawk。不,正如我说过的两次,我在该领域只有断线。我不想删除最后一个数字字段之后的任何其他返回。甚至在我第一次编辑或添加之前,我已经在问题中写下了这一点。想想你告诉我们的——如果你在该领域只有新行,那么你为什么还要担心其他领域的新行呢?没有人建议您删除行末尾的返回-它已经被读取占用,而不是在awk中操作的缓冲区中。你似乎不明白我的意思,对我试图帮助你感到生气,所以我现在就不说了。祝你好运
$ cat -v file
smith|Login|command line is my friend|2^M
oliver|Login|I have no idea
why I am here|10^M
dennis|Payroll|are we there yet?|100^M
smith|Time|going to have some fun|200^M
smith|Logout|here I come|10^M

$ awk 'BEGIN{RS=ORS="\r\n"} {gsub(/\s*\n/," ")} 1' file | cat -v
smith|Login|command line is my friend|2^M
oliver|Login|I have no idea why I am here|10^M
dennis|Payroll|are we there yet?|100^M
smith|Time|going to have some fun|200^M
smith|Logout|here I come|10^M
$ awk 'BEGIN{RS="\r\n"} {gsub(/\s*\n/," ")} 1' file | cat -v
smith|Login|command line is my friend|2
oliver|Login|I have no idea why I am here|10
dennis|Payroll|are we there yet?|100
smith|Time|going to have some fun|200
smith|Logout|here I come|10