猿问
下载APP

SED没有给我正确的Mac换行操作-GNU sed和BSD/OSX sed之间的差异

SED没有给我正确的Mac换行操作-GNU sed和BSD/OSX sed之间的差异

我用的是这个参考资料:SED帮助:匹配和替换文字“\n”(不是换行符)

我有一个文件“test1.txt”,其中包含一个字符串hello\n

我使用这个命令搜索并用实际的新行字符替换“\n”:

sed -i '' 's/\\n/\n/g' test1.txt

但结果是:地狱再见..它只是将“\n”替换为“n”,而不是实际的新行。这与/t一样,它将留下一个“t”而不是一个选项卡。

“表示MAC中未定义的错误:http:/mpecherty.wordpress.com/2010/05/27/Diff-with-sed-就地编辑-onmac-os-x-vs-linux/

更新:

我尝试了@hek2mgl建议的两个命令:

sed -i 's/\\n/\n/g' test.txt
# Or:
sed -i'' 's/\\n/\n/g' test.txt

虽然它们可能与Linux一起工作,但在MAC操作系统下,我得到了以下错误:

sed: 1: "test1.txt": undefined label 'est1.txt'

不知道为什么我不能让这件事起作用。提前谢谢。


慕村225694
浏览 407回答 2
2回答

月关宝盒

与BSD/MacOSsed中使用换行符替换串一种s函数调用时,必须使用\-逃跑实际纽林-逃逸顺序\n是不支持(不像在雷吉电话的一部分)。任一*只需插入实际Newline:sed&nbsp;-i&nbsp;''&nbsp;'s/\\n/\ /g'&nbsp;test1.txt或*使用Ansi C-引号字符串($'...')插入换行符($'\n';在bash,&nbsp;ksh,或zsh):sed&nbsp;-i&nbsp;''&nbsp;'s/\\n/\'$'\n''/g'&nbsp;test1.txtGNU&nbsp;sed相反,是吗?识别\n在替换字符串中;详细了解这两种实现之间的差异。GNU之间的差异sed(Linux)和BSD/MacOSsedMacOS使用BSD版本sed[1],它在许多方面与GNU&nbsp;sed随附的版本linux发行版。他(她,它)们的公分母是由POSIX*见POSIXsed规格。这个最便携方法是为了仅使用POSIX功能,然而,限制功能:特别要注意的是,POSIX指定只支持基本正则表达式,有许多限制(例如,不支持|(交替)根本没有直接支持+和?)和不同的逃逸要求。警告:GNUsed(没有-r),&nbsp;是吗?支撑\|,&nbsp;\+和\?,不符合POSIX的;使用--posix禁用(见下文)。仅使用POSIX功能:控制字符序列,如\n和\t一般不支持。标签和分支命令(例如,b)&nbsp;必后面跟着一个实际通过单独的新行或续行-e选择。详情见下文。(两个版本):使用只这个-n和-e选项(特别是不要使用-E或-r打开对.的支持扩展正则表达式)GNUsed*增加选项--posix为了确保POSIX只提供功能(严格地说,您不需要这一点,但是没有它,您可能会无意中使用非POSIX特性而不注意到这一点;警告:&nbsp;--posix&nbsp;本身是不POSIX-符合规定)使用POSIX专用特性意味着更严格的格式化要求(放弃GNU中提供的许多便利)。sed):然而,双管齐下版本实现扩展符合POSIX标准:什么它们实现的扩展不同(GNU)sed实现更多)。即使是那些扩展它们双管齐下实施语法部分不同.如果您需要支持这两个平台(讨论差异):不相容特征:BSDsed:&nbsp;总是追加换行符对于输出,即使输入行不以一个结尾。GNUsed:&nbsp;保留“尾换行符”状态。,也就是说,只有当输入行以1结尾时,它才会追加换行符。BSDsed*必须使用-i ''GNUsed*必须使用-i(相当于:-i'')-使用-i ''不起作用。使用-i期权无争论(在没有备份的情况下就地更新)是不兼容的:-i理智地打开每输入文件线路编号在……里面GNU&nbsp;sed和最近的版本BSD&nbsp;sed(例如,在FreeBSD 10上),但是从10.12开始就不在MacOS上了.请注意,在不存在的情况下-i&nbsp;全版本数行累积跨输入文件。如果最活的,刚过去的输入行不有一个尾随的新线(印刷本):共同特征:如果你限制你的sedBSD脚本sed支持,它们通常在GNU中工作。sed也是-除了使用特定于平台的显著例外扩展正则表达式特性-E..显然,您还将放弃特定于GNU版本的扩展。见下一节。指导方针跨平台支撑(OSX/BSD,Linux),由BSD版本更严格的要求驱动:注意我用的是速记MacOS和linux的BSD和GNU版本sed因为它们是每个平台上的股票版本。但是,可以安装GNU。sed例如,在MacOS上使用自制带着brew install gnu-sed.注:&nbsp;但当-r和-E使用标志&nbsp;(扩展),下面的说明相当于编写POSIX-符合&nbsp;sed剧本。对于POSIX的遵从性,您必须将自己限制在POSIX Bres(基本正则表达式),不幸的是,顾名思义,这是相当基本的。警告*不要假定\|,&nbsp;\+和\?支持:而GNUsed支持他们(除非--posix),BSDsed不-这些特性是不符合POSIX标准。当\+和\?&nbsp;能,会,可以被模仿以符合POSIX的方式:\{1,\}为\+,\{0,1\}为\?,\|(交替)不可能不幸的是。对于更强大的正则表达式,使用-E(而不是-r)支持埃雷斯扩展正则表达式)(GNU)sed不记录-E的别名-r;&nbsp;较新BSD版本sed,例如FreeBSD 10,现在也支持-r,但MacOS版本在10.10的时候不).警告*即使使用-r&nbsp;/&nbsp;-E意味着您的命令定义为不符合POSIX标准的,您必须仍然限制自己扩展正则表达式..遗憾的是,这意味着您将无法使用几个有用的结构,特别是:词边界断言,因为它们是平台专用(例如,\<在Linux上,[[:<]]在OS X上)。回引内正则表达式(与捕获替换字符串中的组匹配的“反向引用”相反)s函数调用),因为BSDsed不支持他们扩展雷克斯(但奇怪的是,在基本在它们是POSIX的地方-授权)。控制字符转义序列,如\n和\t:仅Linux:sed 's/-/\t/' <<<$'a-b' # -> 'a<tab>b'MacOS和Linux:sed 's/-/'$'\t''/' <<<'a-b'sed 's/-/'"$(printf '\t')"'/' <<<'a-b'仅Linux:sed 's/\t/-/' <<<$'a\tb' # -> 'a-b'MacOS和Linux:sed 's/'$'\t''/-/' <<<$'a\tb' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# ANSI C-quoted stringsed 's/'"$(printf '\t')"'/-/' <<<$'a\tb' # command subst. with printf在……里面雷克斯(在用于选择的模式中和在s函数),假设只有\n被识别为转义序列(很少使用,因为模式空间通常是单株线路(不终止)\n),但不在字符类,所以,例如,[^\n]不工作;(如果您的输入不包含控制字符。除\t,你可以模仿[^\n]带着[[:print:][:blank:]]否则,拼接控制字符。在AS文字[2]) -&nbsp;通常,将控制字符包括为文字,或者通过剪接Ansi C引号字符串(例如,$'\t')在支持它的shell中(bash,KSHzsh),或通过命令替换使用printf(例如,"$(printf '\t')").在……里面替换字符串与s指挥部,假设不支持控制字符转义序列。,所以,再一次,包括控制字符。如文字,如上所示。同为文本参数到i和a功能:&nbsp;不要使用控制字符序列。-见下文。标签和分支*标签和标签名称论辩到b和t功能必须后面跟着一个文字纽线或拼接$'\n'..或者,使用多个-e选项,并在标签名称之后终止每个选项。或者(实际换行符):sed -n '/a/ bLBL d; :LBL p' <<<$'a\nb'或(拼接)$\n(实例):sed -n '/a/ bLBL'$'\n''d; :LBL'$'\n''p' <<<$'a\nb'或(倍数)-e(备选方案):sed -n -e '/a/ bLBL' -e 'd; :LBL' -e 'p' <<<$'a\nb'仅Linux:sed -n '/a/ bLBL; d; :LBL p' <<<$'a\nb' # -> 'a'MacOS和Linux:功能i和a用于插入/附加文本:&nbsp;跟随函数名\,后面跟着一个文字纽线或拼接$'\n'指定文本参数之前。无-e,文本参数在MacOS(bug?)中的输出上没有以换行符结尾,这是令人费解的。不要使用控制字符转义。比如\n和\t在Text参数中,因为它们仅在Linux上被支持。如果文本参数因此具有实际的内部换行符,\-逃离他们。如果要在Text参数之后放置其他命令,则必须使用(未转义的)换行符(无论是文字的还是插入的)终止它,或者继续使用单独的-e选项(这是适用于所有版本的一般要求)。仅Linux:sed '1 i new first line' <<<$'a\nb' # -> 'new first line<nl>a<nl>b'MacOS和Linux:sed -e '1 i\'$'\n''new first line' <<<$'a\nb'注:内功能列表(包含在{...}),&nbsp;也要确保终止最活的,刚过去的函数,关闭前}..;.仅Linux:sed -n '1 {p;q}' <<<$'a\nb' # -> 'a'MacOS和Linux:sed -n '1 {p;q;}' <<<$'a\nb'GNUsed-具体特征BSD失踪sed共:如果您需要支持这两个平台,您可能会错过GNU特性:五花八门正则匹配和替换选项(行选择的模式和s职能):这个I不区分大小写的正则表达式匹配选项(难以置信,BSD)sed一点也不支持)。这个M多行匹配选项(其中^&nbsp;/&nbsp;$匹配开始/结束每一行)获取特定于s功能见https:/www.gnu.org/Software/sed/手动/sim.html#the-_0022 s_0022-Command逸出序列与替换相关的转义序列,如\u的替换参数中,s///函数允许子串操作,在限制范围内;例如,sed 's/^./\u&/' <<<'dog' # -> 'Dog'-见http:/www.gnu.org/Software/sed/HANDELL/ISA.html#the-_0022 s_0022-Command控制字符转义序列:除了\n,&nbsp;\t,基于代码点的转义;例如,以下所有转义符(十六进制、八进制、十进制)都表示一个单引号('):&nbsp;\x27,&nbsp;\o047,&nbsp;\d039-见https:/www.gnu.org/Software/sed/手动/sec.html#Escape地址扩展,如first~step为了匹配每一步,addr, +N匹配以下N行addr,-看网址:http:/www.gnu.org/Software/sed/手动/sec.html#Address[1]MacOSsed版本是老一点比其他类似BSD的系统上的版本,如FreeBSD和PC-BSD.不幸的是,这意味着您不能假设在FreeBSD中工作的特性将在MacOS上[同样]工作。[2]ANSI C-引号字符串$'\001\002\003\004\005\006\007\010\011\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\177'包含除ASCII以外的所有ASCII控制字符。\n(和nul),所以您可以将它与[:print:]对于一个相当健壮的仿真[^\n]:'[[:print:]'$'\001\002\003\004\005\006\007\010\011\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\177'']

慕田峪9158850

这似乎有点奇怪,但请尝试:sed&nbsp;-i&nbsp;''&nbsp;'s/\\n/\ /g'&nbsp;test1.txt也就是说,使用实际新线代替\n.原因是你有个奇怪的sed!有关详细信息,请参阅Macsed手册:https:/developer.apple.com/Library/mac/Document/达尔文/Reference/ManPages/man 1/sed.1.html在描述s那里的指挥部说:A&nbsp;line&nbsp;can&nbsp;be&nbsp;split&nbsp;by&nbsp;substituting&nbsp;a&nbsp;newline&nbsp;character&nbsp;into&nbsp;it.&nbsp;&nbsp;To&nbsp;specify a&nbsp;newline&nbsp;character&nbsp;in&nbsp;the&nbsp;replacement&nbsp;string,&nbsp;precede&nbsp;it&nbsp;with&nbsp;a&nbsp;backslash.同时,在对-i选项,它表示扩展不是可选的,如果不需要扩展,则必须指定一个空参数。所以最后一切都是有意义的!
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答