【问题标题】:How to replace Pipe with a new line in Linux?如何在 Linux 中用新行替换 Pipe?
【发布时间】:2016-06-10 01:33:36
【问题描述】:

如果之前有人问过这个问题,请接受我的歉意。我是新手,不知道该怎么做。我有一个包含如下数据的文件:

name=1|surname=2|phone=3|email=4
phone=5|surname=6|name=7|email=8
surname=9|phone=10|email=11|name=12
phone=13|email=14|name=15|surname=6

我想要一个这样的文件:

name=1
name=7
name=12
name=15

提前致谢!

【问题讨论】:

  • "cat infile | sed 's#|#\n#g' > outfile" 应该可以解决问题。
  • 你能解释一下这部分吗? sed 's#|#\n#g'
  • cat infile | sed 's#|#\n#g' > outfile 应该可以解决问题。 sed,“流编辑器”的缩写,处理 infile 的内容并将输出重定向到 outfile。 s#A#B#g 命令将出现的 A 替换为 B;末尾的 g 表示全局替换(即,每次出现的 A 都被 B 替换)。因此,此命令替换每次出现的“|”在 infile 中用换行符 ("\n") 将结果写入 outfile。

标签: linux shell command-line scripting


【解决方案1】:

说 names.txt 是你的文件,然后使用类似:

cat names.txt  | tr "|" "\n" | grep "^name="
  • tr| 转换为换行符
  • grep 过滤具有名称的行

这是一个使用 GNU awk 的单一命令解决方案:

 awk -v RS="[|\n]" '/^name=/' names.txt 
  • -v RS="[|\n]' set the record separatro to|` 或换行符
  • /^name=/ 过滤以name= 开头的记录(并隐式打印它们)

【讨论】:

    【解决方案2】:

    我会选择@Lars 的解决方案,但我想用“lookbehind”来测试它。 使用grep,您只能使用grep -o 获得匹配项,但以下行也会找到姓氏:

    grep -o "name=[0-9]*" names.txt
    

    您可以通过查找名称前的字符(以^| 开头)来解决此问题。

    grep -o "(^|\|)name=[0-9]*" names.txt
    

    什么解决方法!现在你得到了正确的名字,但有时会有一个额外的|
    使用 \K(和 grep 选项 -P),您可以告诉 grep 使用某些内容进行匹配,但在输出期间跳过它。

    grep -oP "(^|\|)\Kname=[0-9]*" names.txt
    

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2016-06-06
      • 2015-05-25
      相关资源
      最近更新 更多