Cygwin sed:使用十六进制、八进制或十进制搜索/替换单个不可打印字符

Cygwin sed:使用十六进制、八进制或十进制搜索/替换单个不可打印字符,sed,cygwin,hex,ascii,octal,Sed,Cygwin,Hex,Ascii,Octal,很抱歉问这么简单的问题,但我已经瞎了四天的学习和尝试,似乎找不到正确的语法 使用cygwin上的sed,我试图用另一个不可打印的字符替换一个不可打印的ASCII字符 这是我的源文件,使用大写文本[方括号内]表示不可打印的ascii字符: myfile.txt: line one[LF] line two[LF] line three[LF] [SUBSTITUTE][LF] line four{LF] line five[LF] line six[LF] . . . 我想用标签替换LFs 因

很抱歉问这么简单的问题,但我已经瞎了四天的学习和尝试,似乎找不到正确的语法

使用cygwin上的sed,我试图用另一个不可打印的字符替换一个不可打印的ASCII字符

这是我的源文件,使用大写文本[方括号内]表示不可打印的ascii字符:

myfile.txt:

line one[LF]
line two[LF]
line three[LF]
[SUBSTITUTE][LF]
line four{LF]
line five[LF]
line six[LF]
.
.
.
我想用标签替换LFs

因为LFs是十六进制0A,而TAB是十六进制09,所以我基本上尝试过:

sed -i 's/\x0A/\x09/g' myfile.txt
它不会更改文件中的任何内容

当然,我尝试过不同的开关,比如-b、-e和-r,带括号和不带括号,带和不带/g,额外的反斜杠和不带反斜杠,八进制和十进制符号,一直到精灵符文,都没有成功

我读了一些答案,这些答案使用“echo”而不是文件作为来源,它们只是把我弄糊涂了,不起作用

其他的例子使用了“欺骗”,比如实际的单词标签,但是它们阻止我使用数字学习语法,所以我可以将它应用到其他不可打印的字符,而不仅仅是标签

当我尝试“file”命令时,我得到:

file myfile.txt
file.txt: data
所以,我当然试过:

sed -i -t UTF-8 's/\x0A/\x09/g' myfile.txt
但我的sed不支持-t选项

当我尝试这个:

oc -c myfile.txt
我要搜索的[LF]字符显示为:

\n
我也尝试过\0D作为我的搜索词,也没有运气

如果有人想通过展示正确的语法来给我提供线索,我将不胜感激


谢谢。

使用
tr
怎么样

tr '\012' '\011' < myfile.txt > tmp.out
mv tmp.out myfile.txt
tr'\012'\011'tmp.out
mv tmp.out myfile.txt

tr
命令是一个纯过滤器;它(在标准版本中,无论如何)不接受任何文件名参数或支持覆盖或…

使用
tr
怎么样

tr '\012' '\011' < myfile.txt > tmp.out
mv tmp.out myfile.txt
tr'\012'\011'tmp.out
mv tmp.out myfile.txt

tr
命令是一个纯过滤器;它(在标准版本中,无论如何)不接受任何文件名参数或支持覆盖或…

在sed中指定换行符的可移植方法是使用转义返回:

sed -i 's/\
/<tab>/g'
sed-i的/\
//g'

用文本制表符替换文本。

在sed中指定换行符的可移植方法是使用转义返回:

sed -i 's/\
/<tab>/g'
sed-i的/\
//g'

将文本
替换为文本制表符。

如果您使用的是
bash
ksh
我建议您使用支持C样式反斜杠转义的shell的
$'…
语法。例如:

[BASH] # echo $'hello\nworld'
hello
world
[BASH] # echo $'hello\x0aworld'
hello
world
[BASH] #

如果您使用的是
bash
ksh
,我建议您使用shell的
$'…
语法,它支持C风格的反斜杠转义。例如:

[BASH] # echo $'hello\nworld'
hello
world
[BASH] # echo $'hello\x0aworld'
hello
world
[BASH] #

谢谢大家,我很感谢那些试图帮助我的人。如果StackOverflow允许我,我将投票支持每一次帮助尝试

我在回答我自己的问题,希望它能帮助别人

我了解到sed不能处理LFs的说法并不完全正确。它可以处理它们,但只有在编写它们的时候。读的时候不会

所以,我不能完全像我所希望的那样与sed一起完成工作。我喜欢sed的就地开关,它看起来不像创建另一个文件那么凌乱,因此吸引了我的强迫症患者

我的文件格式为:

Mary(LF)
Smith(LF)
(SUB)(LF)
John(LF)
Public(LF)
(SUB)(LF)
我想要的结果是:

Mary(TAB)Smith(LF)
John(TAB)Public(LF)
所以,我想把LF换成TAB,LF-SUB-LF换成LF

我首先使用TR将所有lf更改为tab,从而解决了我的问题。无法为此使用sed

# change LFs to TABs ... so grep can later treat entire file as one line
tr '\012' '\011' < comengo.extract.txt > comengo.extract.out
mv comengo.extract.out comengo.extract.txt
然后我使用sed将LFs恢复到文件中,sed可以编写LFs

# (sub) to (tab)(lf)
sed -i 's/\x1A/\x0A\x09/g'  comengo.extract.txt

这很有魅力。

谢谢大家,我很感谢那些试图帮助我的人。如果StackOverflow允许我,我将投票支持每一次帮助尝试

我在回答我自己的问题,希望它能帮助别人

我了解到sed不能处理LFs的说法并不完全正确。它可以处理它们,但只有在编写它们的时候。读的时候不会

所以,我不能完全像我所希望的那样与sed一起完成工作。我喜欢sed的就地开关,它看起来不像创建另一个文件那么凌乱,因此吸引了我的强迫症患者

我的文件格式为:

Mary(LF)
Smith(LF)
(SUB)(LF)
John(LF)
Public(LF)
(SUB)(LF)
我想要的结果是:

Mary(TAB)Smith(LF)
John(TAB)Public(LF)
所以,我想把LF换成TAB,LF-SUB-LF换成LF

我首先使用TR将所有lf更改为tab,从而解决了我的问题。无法为此使用sed

# change LFs to TABs ... so grep can later treat entire file as one line
tr '\012' '\011' < comengo.extract.txt > comengo.extract.out
mv comengo.extract.out comengo.extract.txt
然后我使用sed将LFs恢复到文件中,sed可以编写LFs

# (sub) to (tab)(lf)
sed -i 's/\x1A/\x0A\x09/g'  comengo.extract.txt

这很有魅力。

事实上,如果在二进制文件上使用--null数据,sed可以匹配LF字符:


$echo-e“Line1\r\nLine2\rLine3\nLine4\n\rLine5”| sed--空数据--二进制-r-e“s/\x0d\x0a/\x0a/g”| od--格式=x1a
0000000 4c 69 6e 65 31 0a 4c 69 6e 65 32 0d 4c 69 6e 65
L i n e 1 nl L i n e 2 cr L i n e
00000 20 33 0a 4c 69 6e 65 34 0a 0d 4c 69 6e 65 35 0a
3 nl LIN e 4 nl cr LIN e 5 nl

事实上,如果在--binary上面使用--null数据,sed可以匹配LF字符:


$echo-e“Line1\r\nLine2\rLine3\nLine4\n\rLine5”| sed--空数据--二进制-r-e“s/\x0d\x0a/\x0a/g”| od--格式=x1a
0000000 4c 69 6e 65 31 0a 4c 69 6e 65 32 0d 4c 69 6e 65
L i n e 1 nl L i n e 2 cr L i n e
00000 20 33 0a 4c 69 6e 65 34 0a 0d 4c 69 6e 65 35 0a
3 nl LIN e 4 nl cr LIN e 5 nl

谢谢,但TR无法就地更换。我所寻求的东西真的不可能用cygwin sed实现吗?我不知道;我会使用
tr
,不用担心。由于您通过删除换行符来展平文件,因此我担心使用面向行的
sed
。为什么“到位”至关重要?你确定sed的方式“就地”有足够的区别吗?我不只是想钓到一条鱼。我是