【问题标题】:Using sed to split a string with a delimiter使用 sed 用分隔符分割字符串
【发布时间】:2013-08-16 13:28:56
【问题描述】:

我有一个格式如下的字符串:

string1:string2:string3:string4:string5

我正在尝试使用sed 拆分: 上的字符串并将每个子字符串打印在新行上。这是我正在做的事情:

cat ~/Desktop/myfile.txt | sed s/:/\\n/

打印出来:

string1
string2:string3:string4:string5

如何让它在每个分隔符上拆分?

【问题讨论】:

  • 你可以考虑tr : '\n' <~/Desktop/myfile.txt。由于sed 可以非常愉快地打开文件,因此您不需要在问题的示例中使用cat

标签: linux bash sed string-split


【解决方案1】:

要使用 GNU sed 使用分隔符拆分字符串,您可以这样说:

sed 's/delimiter/\n/g'     # GNU sed

例如,使用: 作为分隔符进行拆分:

$ sed 's/:/\n/g' <<< "he:llo:you"
he
llo
you

或者使用非 GNU sed:

$ sed $'s/:/\\\n/g' <<< "he:llo:you"
he
llo
you

在这种特殊情况下,您在替换后错过了g。因此,它只进行一次。见:

$ echo "string1:string2:string3:string4:string5" | sed s/:/\\n/g
string1
string2
string3
string4
string5

g 代表global,表示替换必须在全局范围内进行,即任何情况下都可以进行。看到默认是 1,如果你放 2,它会执行 2 次,等等。

在你的情况下,你需要使用:

sed 's/:/\\n/g' ~/Desktop/myfile.txt

请注意,您可以直接使用sed ... file 语法,而不是不必要的管道:cat file | sed

【讨论】:

  • 该死!我是如此接近。 g 有什么作用?我会尽快接受你的回答。谢谢!
  • 它代表global,意味着替换必须完成globally,也就是说,对于任何情况。看到默认是 1,如果你把例如 2,它完成 2 次,等等。
  • 这在非 GNU sed 中不起作用。规范/可移植的方式,比如说,你的最后一个例子是sed $'s/:/\\\n/g' file.txt,依靠 bash 格式引用来解释 ANSI 反斜杠符号。
  • @ghoti 谢谢,我也更新了这种方法。今后,请随时更新帖子,使其更正确,我们都从中学习!
【解决方案2】:

应该这样做:

cat ~/Desktop/myfile.txt | sed s/:/\\n/g

【讨论】:

    【解决方案3】:

    sed 中使用\n 是不可移植的。使用sed 做你想做的事的便携方式是:

    sed 's/:/\
    /g' ~/Desktop/myfile.txt
    

    但实际上这不是 sed 的工作,而是 tr 的工作:

    tr ':' '
    ' < ~/Desktop/myfile.txt
    

    【讨论】:

    • 在 iTerm 上,在 MacOS 上,可以使用 alt+enter 在输入上完成结束行字符。拆分 $PATH 变量 btw 的便捷技巧。
    【解决方案4】:

    如果您使用的是 gnu sed,那么您可以使用 \x0A 换行:

    sed 's/:/\x0A/g' ~/Desktop/myfile.txt
    

    【讨论】:

    • 不一定。 Win32 环境将使用不同的换行符,最后我检查了一下,Cygwin 使用 gnu sed。
    【解决方案5】:

    这可能对你有用(GNU sed):

    sed 'y/:/\n/' file
    

    或许:

    sed y/:/$"\n"/ file
    

    【讨论】:

      【解决方案6】:

      简单地使用

      $ tr ':' $'\n' <<< string1:string2:string3:string4:string5
      string1
      string2
      string3
      string4
      string5
      

      如果你真的需要

      $ sed 's/:/\n/g' <<< string1:string2:string3:string4:string5
      string1
      string2
      string3
      string4
      string5
      

      【讨论】:

      • 喜欢使用 tr 的解决方案。简单方便。谢谢
      猜你喜欢
      • 2021-12-08
      • 2013-05-03
      • 2021-06-12
      • 1970-01-01
      • 2020-07-04
      • 2011-09-12
      • 2017-07-08
      相关资源
      最近更新 更多