Macos 命令行文本查找/替换^M(\r)和^K(\v)
我正在尝试编写一个shell脚本,它将用新行替换windows的行结尾(Macos 命令行文本查找/替换^M(\r)和^K(\v),macos,bash,text,replace,sed,Macos,Bash,Text,Replace,Sed,我正在尝试编写一个shell脚本,它将用新行替换windows的行结尾(^m)和垂直选项卡(^K)Sed看起来像是要使用的工具,但我不太明白。我不明白这为什么行不通 $ sed -i 's/^K/\n/g' article_filemakerExport.xml sed: 1: "article_filemakerExport ...": command a expects \ followed by text 注意:我正在使用mac电脑 在Windows行结束时,您希望删除^M(或\r或回
^m
)和垂直选项卡(^K
)Sed
看起来像是要使用的工具,但我不太明白。我不明白这为什么行不通
$ sed -i 's/^K/\n/g' article_filemakerExport.xml
sed: 1: "article_filemakerExport ...": command a expects \ followed by text
注意:我正在使用mac电脑 在Windows行结束时,您希望删除^M(或
\r
或回车符),但您希望用换行符替换^K,这似乎是正确的
我要使用的命令是tr
,两次
tr -d '\r' < article_filemakerExport.xml | tr '\13' '\12' > tmp.$$ &&
mv tmp.$$ article_filemakerExport.xml || rm -f tmp.$$
或者,如果您愿意:
tr '\13\r' '\n\n' < article_filemakerExport.xml > tmp.$$ &&
mv tmp.$$ article_filemakerExport.xml || rm -f tmp.$$
您可以在Unicode站点()上找到这些控制字符的完整集合。毫无疑问,还有许多其他可能的地方可以查看。在Windows行结束时,您希望删除^M(或
\r
或回车符),但您似乎希望用换行符替换^K
dos2unix <article_filemakerExport.xml | tr '\013\015' '\n\n'
我要使用的命令是tr
,两次
tr -d '\r' < article_filemakerExport.xml | tr '\13' '\12' > tmp.$$ &&
mv tmp.$$ article_filemakerExport.xml || rm -f tmp.$$
或者,如果您愿意:
tr '\13\r' '\n\n' < article_filemakerExport.xml > tmp.$$ &&
mv tmp.$$ article_filemakerExport.xml || rm -f tmp.$$
您可以在Unicode站点()上找到这些控制字符的完整集合。毫无疑问,还有许多其他可能的地方可供寻找。dos2unixdos2unixBSD(OS X)sed
解决方案,由以下方面辅助:
dos2unix <article_filemakerExport.xml | tr '\013\015' '\n\n'
注:
- BSD
sed
——与GNUsed
——不同,它需要一个带有-i
选项的参数;因此,若要指示不应创建备份文件,必须传递一个空字符串(“
”),请参见下文,以了解如何解释您得到的错误
- 该命令将
\r\n
替换为\n\n
,而不是\n
,这是我理解您想要的(要仅获取\n
,只需将第二个替换字符串设为空;要替换\r
,即使后面没有紧跟\n
,请在\r
之后删除$/code>)
下面是一个带有示例输入的概念证明:
$ sed $'s/\r$/\\\n/g; s/\v/\\\n/g' <<<$'one\vtwo\r\nthree\nfour'
one
two
three
four
$sed$s/\r$/\\\n/g;s/\v/\\\n/g'BSD(OS X)sed
解决方案,由以下人员协助:
注:
- BSD
sed
——与GNUsed
——不同,它需要一个带有-i
选项的参数;因此,若要指示不应创建备份文件,必须传递一个空字符串(“
”),请参见下文,以了解如何解释您得到的错误
- 该命令将
\r\n
替换为\n\n
,而不是\n
,这是我理解您想要的(要仅获取\n
,只需将第二个替换字符串设为空;要替换\r
,即使后面没有紧跟\n
,请在\r
之后删除$/code>)
下面是一个带有示例输入的概念证明:
$ sed $'s/\r$/\\\n/g; s/\v/\\\n/g' <<<$'one\vtwo\r\nthree\nfour'
one
two
three
four
$sed$s/\r$/\\\n/g;s/\v/\\\n/g“dos2unix不满足您的需要吗?dos2unix不满足您的需要吗?在您第一次调用tr时,我认为您需要重定向,而不是指定文件名。既然tr是标准的,dos2unix并不总是可用的,那么你的答案就比我的好。谢谢,@PeterBowers;是的,它缺少了一个doub1ejack,我想你会发现@JonathanLeffler的答案正是你想要的。DOS/WIndows“换行符”实际上是2个字符,删除时\r将保留UNIX换行符。然后在第二个tr中,他将\013(八进制中的^K)更改为\12(UNIX换行符)。因此,DOS换行符和^K都转换为UNIX换行符。试试看-你会喜欢的…:-)@埃德蒙顿:很公平……也要改变它。^G是贝尔,或\a
,或\007
(詹姆斯·邦德字符),或\7
(这些是八进制常数,有或没有前导零)。我将在主要答案中添加一些关于控制字符名称的注释^K
也是“垂直制表”,因此\v
可能会映射到这一点(我在Mac上就是这样做的)。在您第一次调用tr时,我认为您需要重定向,而不是指定文件名。既然tr是标准的,dos2unix并不总是可用的,那么你的答案就比我的好。谢谢,@PeterBowers;是的,它缺少了一个doub1ejack,我想你会发现@JonathanLeffler的答案正是你想要的。DOS/WIndows“换行符”实际上是2个字符,删除时\r将保留UNIX换行符。然后在第二个tr中,他将\013(八进制中的^K)更改为\12(UNIX换行符)。因此,DOS换行符和^K都转换为UNIX换行符。试试看-你会喜欢的…:-)@埃德蒙顿:很公平……也要改变它。^G是贝尔,或\a
,或\007
(詹姆斯·邦德字符),或\7
(这些是八进制常数,有或没有前导零)。我将在主要答案中添加一些关于控制字符名称的注释^K
也是“垂直制表”,因此\v
可能会映射到这一点(我在Mac上就是这样做的)。为什么这里需要dos2unix?看起来也许这只是一种更安全的方式将信息导入tr
?它对文本还有其他作用吗?我看到它用换行符替换dos回车。但只有当他们在一条线的尽头时。我把^M
字符散布在整行文本中……啊,在你的问题中,你特别提到了windows行的结尾,然后把^M放在括号中。我们假定您指的是真正的windows行结尾,实际上是\r\n。我将相应地编辑我的答案。为什么这里需要dos2unix?看起来也许这只是一种更安全的方式将信息导入tr
?它对文本还有其他作用吗?我看到它用换行符替换dos回车。但只有当他们在一条线的尽头时。我把^M
字符散布在整行文本中……啊,在你的问题中,你特别提到了windows行的结尾,然后把^M放在括号中。我们假定您指的是真正的windows行结尾,实际上是\r\n。我将编辑我的答案