首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取字符串中每次出现给定字符/模式之前的字符

获取字符串中每次出现给定字符/模式之前的字符
EN

Stack Overflow用户
提问于 2018-07-04 08:27:14
回答 8查看 130关注 0票数 1

我正在尝试使用标准bash工具获取字符串中每次出现给定字符/模式之前的字符,如grep、awk/gawk、sed……

Step I:获取每次出现字符:之前的字符

示例:

字符串1 => :hd:fg:kl:

String 2 => :df:lkjh:

String 3 => :glki:l:s:d:

预期结果

结果1 => dgl

结果2 => fh

结果3 => ilsd

我用awk尝试了很多次,但都没有成功。

Step II:在结果字符串的每个字符之间插入一个给定的字符

使用/的示例

结果1 => d/g/l

结果2 => f/h

结果3 => i/l/s/d

对于这个步骤awk -F '' -v OFS="/" '{$1=$1;print}',我有一个awk表达式

我不知道是否可以用awk或sed来做Step I,为什么不同时做Step IStep II呢?

亲切的问候

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2018-07-04 10:06:52

下面是什么:

代码语言:javascript
复制
awk 'BEGIN{FS=":"}{for(i=1;i<NF;i++){if(i>2)printf"/";printf substr($i,length($i))}print""}' input.txt

input.txt:

代码语言:javascript
复制
:hd:fg:kl:
:df:lkjh:
:glki:l:s:d:

输出:

代码语言:javascript
复制
d/g/l
f/h
i/l/s/d
票数 1
EN

Stack Overflow用户

发布于 2018-07-04 10:07:57

Solution Could:你可以试着关注一下,让我知道这是否对你有帮助。

代码语言:javascript
复制
awk -F":" '
{
  for(i=1;i<=NF;i++){
    if($i){ val=(val?val:"")substr($i,length($i)) }
  }
  print val;
  val=""
}' Input_file

输出如下所示。

代码语言:javascript
复制
dgl
fh
ilsd

解决方案2:输出字符串之间带有/

代码语言:javascript
复制
awk '
BEGIN{
  OFS="/";
  FS=":"
}
{
  for(i=1;i<=NF;i++){
    if($i){
      val=(val?val OFS:"")substr($i,length($i))
    }}
  print val;
  val=""
}' Input_file

输出如下所示。

代码语言:javascript
复制
d/g/l
f/h
i/l/s/d

解决方案3:awkmatch实用程序。

代码语言:javascript
复制
awk '
{
  while(match($0,/[a-zA-Z]:/)){
    val=(val?val:"")substr($0,RSTART,RLENGTH-1)
    $0=substr($0,RSTART+RLENGTH)
   }
  print val
  val=""
}'  Input_file
票数 1
EN

Stack Overflow用户

发布于 2018-07-04 09:43:43

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed -r 's/[^:]*([^:]):+|:+/\1/g;s/\B/\//g' file

将零个或多个非:替换为整行中的单个字符,然后在每个字符之间插入一个:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51164358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档