我想在特定的第二次出现后删除所有内容
字符串中的模式。在Unix中最好的方法是什么?实现这一目标的最优雅,最简单的方法是什么; sed
,awk
或只是像cut
这样的unix命令?
我的输入是
After-u-math-how-however
输出应为
After-u
第二个-
之后的所有内容都应该被删除。正则表达式也应该匹配
零发生的模式,因此应忽略零或一次出现
从第二次出现,一切都应该被删除。
所以如果输入如下
After
输出应为
After
答案 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)
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
),然后:
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}'