Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 命令行文本查找/替换^M(\r)和^K(\v)_Macos_Bash_Text_Replace_Sed - Fatal编程技术网

Macos 命令行文本查找/替换^M(\r)和^K(\v)

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或回

我正在尝试编写一个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
或回车符),但您希望用换行符替换^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站点()上找到这些控制字符的完整集合。毫无疑问,还有许多其他可能的地方可供寻找。

dos2unix
dos2unixBSD(OS X)
sed
解决方案,由以下方面辅助:

dos2unix <article_filemakerExport.xml | tr '\013\015' '\n\n'
注:

  • BSD
    sed
    ——与GNU
    sed
    ——不同,它需要一个带有
    -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
    ——与GNU
    sed
    ——不同,它需要一个带有
    -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。我将编辑我的答案