Linux sed未找到';0A';控制字符

Linux sed未找到';0A';控制字符,linux,sed,Linux,Sed,该文件包含一个回车行馈送序列十六进制'DA'。Hexedit清楚地显示了两个十六进制字符 20 0D 0A 31 及 清楚地识别了线路 然而 找不到任何行 使用sed删除“0D”后,为了使其更有趣,在字符串中找不到“0A”: 20 0A 31 如何使用sed删除特定字符串后的0D0A。该文件在特定文本后有多余的换行符。这将在应有一条线的位置创建两条线。目标是从两个中重新创建一个 sed逐行读取输入;行之间用\x0a分隔 您可以改为使用Perl,-0777读取整个文件,而不是逐行读取: per

该文件包含一个回车行馈送序列十六进制'DA'。Hexedit清楚地显示了两个十六进制字符

20 0D 0A 31

清楚地识别了线路 然而

找不到任何行

使用sed删除“0D”后,为了使其更有趣,在字符串中找不到“0A”:

20 0A 31

如何使用sed删除特定字符串后的0D0A。该文件在特定文本后有多余的换行符。这将在应有一条线的位置创建两条线。目标是从两个中重新创建一个

sed
逐行读取输入;行之间用
\x0a
分隔

您可以改为使用Perl,
-0777
读取整个文件,而不是逐行读取:

perl -0777 -pe 's/\x0d\x0a//'

sed
中,与python不同,换行符
\n
被视为行分隔符,而不是任何行的一部分。如果要修改换行符,请立即读入整个文件,然后进行替换:

sed 'H;1h;$!d;x; s/something\n/somethingelse/g'
工作原理
sed
既有一个模式空间(新读行的位置)又有一个保持空间。这些命令将新读取的行附加到保持空间,直到到达最后一行。然后,整个文件被传输到模式空间,您可以根据需要对其执行任何命令。详细内容:

  • H
    -追加当前行以保留空格
  • 1h
    -如果这是第一行,覆盖保留空间 用它
  • $!d
    -如果这不是最后一行,请删除图案空间 然后跳到下一行
  • x
    -交换保留空间和模式空间以放入整个文件 模式空间
例子

让我们考虑这个示例文件:

$ cat file
Try to av-
oid word
splits.
现在,让我们将任何以连字符结尾的行与下面的行合并:

$ sed 'H;1h;$!d;x; s/-\n//g' file
Try to avoid word
splits.
或者,如果您喜欢十六进制形式:

$ sed 'H;1h;$!d;x; s/-\x0a//g' file2
Try to avoid word
splits.

. 通常使用
dos2unix
@KarolyHorvath良好技巧,但OP希望“删除特定字符串后的0D0A[仅]”
$ sed 'H;1h;$!d;x; s/-\n//g' file
Try to avoid word
splits.
$ sed 'H;1h;$!d;x; s/-\x0a//g' file2
Try to avoid word
splits.