在unix中的字符串中第二次出现后删除所有内容

时间:2014-05-16 00:12:52

标签: regex bash unix awk sed

我想在特定的第二次出现后删除所有内容 字符串中的模式。在Unix中最好的方法是什么?实现这一目标的最优雅,最简单的方法是什么; sedawk或只是像cut这样的unix命令?

我的输入是

After-u-math-how-however

输出应为

After-u

第二个-之后的所有内容都应该被删除。正则表达式也应该匹配 零发生的模式,因此应忽略零或一次出现 从第二次出现,一切都应该被删除。

所以如果输入如下

After

输出应为

After

8 个答案:

答案 0 :(得分:9)

这样的事情怎么样?

echo "After-u-math-how-however" | cut -f1,2 -d'-'

答案 1 :(得分:3)

这可能适合你(GNU sed):

sed 's/-[^-]*//2g' file

答案 2 :(得分:2)

您可以使用以下正则表达式来选择您想要的内容:

^[^-]*-\?[^-]*

例如:

echo "After-u-math-how-however" | grep -o "^[^-]*-\?[^-]*"

结果:

After-u

答案 3 :(得分:2)

@ EvanPurkisher的cut -f1,2 -d'-'解决方案是恕我直言最好的解决方案,但是因为你问过sed和awk:

使用GNU sed for -r

$ echo "After-u-math-how-however" | sed -r 's/([^-]+-[^-]*).*/\1/'
After-u

使用gensub()的GNU awk:

$ echo "After-u-math-how-however" | awk '{$0=gensub(/([^-]+-[^-]*).*/,"\\1","")}1'
After-u

可以使用\(*使用非GNU sed,必要时使用match()substr()使用非GNU awk。

答案 4 :(得分:1)

这可以在纯bash中完成(这意味着没有fork,没有外部进程)。读入' - '上的数组拆分,然后切片数组:

$ IFS=-
$ read -ra val <<< After-u-math-how-however
$ echo "${val[*]}"
After-u-math-how-however
$ echo "${val[*]:0:2}"
After-u

答案 5 :(得分:1)

awk -F - '{print $1 (NF>1? FS $2 : "")}' <<<'After-u-math-how-however'
  • 根据字段分隔符-(选项规范-F -)将行拆分为字段 - 可作为特殊变量FS 访问 {{1}程序。
  • 始终打印第一个字段(awk),然后:
    • 如果超过1个字段print $1),请附加NF>1(即FS)和第2个字段({{ 1}})
    • 否则:追加-,即:实际上只打印第一个字段(如果输入为空,则本身可能为空)。

答案 6 :(得分:0)

awk '$0 = $2 ? $1 FS $2 : $1' FS=-

结果

After-u
After

答案 7 :(得分:0)

这将在awk中执行:

echo "After" | awk -F "-" '{printf "%s",$1; for (i=2; i<=2; i++) printf"-%s",$i}'