【问题标题】:Get characters between two exact pipe | character in unix [duplicate]获取两个精确管道之间的字符 | unix中的字符[重复]
【发布时间】:2014-07-18 23:39:38
【问题描述】:

我需要 grep 文件中 secondthird |(管道)字符之间的所有字符。

假设我们有一个带有如下字符串的文件(两行):

abc123 | def123 | ghi123 | jkl123 | mno123
abc123 | def123 | jkl123 | ghi123 | mno123

在我使用 grep/sed/awk 命令后,我应该会喜欢

ghi123
jkl123 

如果有任何线索或帮助,我将不胜感激。

【问题讨论】:

  • 你尝试了什么?
  • 一条线索:cut -d '|' -f 3
  • 如果是 all characters 在第二和第三管道之间,你错过了ghi123 & jkl123 前后的空格...
  • awk -F'|' '{gsub(" ",""); print $3}' file
  • 感谢 Jidder,这与我的答案非常接近,但输出中的空格似乎消失了?我需要按原样获取字符串,这怎么可能?发现 awk -F'|' '{ print $3}' ab.txt ...谢谢 :)

标签: regex bash unix awk sed


【解决方案1】:

如果您想始终获得第三个元素,您可以尝试:

echo "abc123 | def123 | ghi123 | jkl123 | mno123" | awk -F " | " '{print $5}'

或者:

echo "abc123 | def123 | ghi123 | jkl123 | mno123" | cut -d '|' -f 3 | tr -d ' '

输出:

ghi123

对于在| 之间有很多单词的字符串,您可以使用:

echo "abc123 | def123 | foo bar | jkl123 buz | mno123" | cut -d '|' -f 3 | sed -e 's/^ //' | sed -e 's/ $//'

输出:

foo bar

注意sed -e 's/^ //' | sed -e 's/ $//' 用于删除第一个和最后一个空格,因为tr -d ' ' 会删除字符串中的所有空格。

【讨论】:

  • 嗯,它并不总是一个词,字符串可能如下 abc1323 abc123 | bdc123 bdc123 bdc123 | jkl123 jk ...所以我需要第二个和第三个管道之间的所有字符串
  • 不会是{print $3} 吗?
  • @Jidder 很遗憾没有,因为| 也算在内
  • awk -F'|' '{gsub(" ",""); print $3}' file 为什么这对没有空格的 $3 有效?我知道命令在我写的时候做了什么。但我很感兴趣为什么这不算| ?
  • @Jidder 是的! :) 你做到了!请将其发布为答案 :) 现在,在阅读了 FIELDSREGULAR EXPRESSIONSawk 手册页部分之后,很清楚发生了什么。 -F' | ' 将仅选择空格作为分隔符,或者更好地使用 space or space。这是因为多字符分隔符将作为正则表达式受到威胁。
猜你喜欢
  • 2018-07-18
  • 1970-01-01
  • 2020-11-25
  • 2020-01-29
  • 1970-01-01
  • 2013-04-02
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多