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

时间:2018-07-04 00:27:14

标签: bash awk sed

我正在尝试使用标准bash工具(如grep,awk / gawk,sed等)获取字符串中每次出现给定字符/图案之前的字符。

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

示例:

  

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

     

字符串2 =>:df:lkjh:

     

字符串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

问候

8 个答案:

答案 0 :(得分:1)

那又怎么样:

function dataURLtoFile(dataurl, filename) {
    var arr = dataurl.split(',')
    var mime = arr[0].match(/:(.*?);/)[1];
    var bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, {type:mime});
  }



$scope.uploadImage = function (file) {
var inputConfig = {
  bucket: 'wtcb/ticket',
  access_key: 'AKIAJNHK7O....',
  secret_key: 'XkETf49b/YpM6tgiBRa2x....'
};
AWS.config.update({
  accessKeyId: inputConfig.access_key,
  secretAccessKey: inputConfig.secret_key
});
AWS.config.region = 'us-east-2';
var bucket = new AWS.S3({
  params: {
    Bucket: inputConfig.bucket
  }
});
var params = {
  Key:file.name,
  ContentType: file.type,
  Body: file,
  ACL: 'public-read',
  ServerSideEncryption: 'AES256'
};
bucket.putObject(params, function (err, data) {
  if (err) {} else {
    var object = {
      url: 'https://s3-us-east-2.amazonaws.com/wtcb/ticket/' + filename
    };
  }
})

input.txt:

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

输出:

:hd:fg:kl:
:df:lkjh:
:glki:l:s:d:

答案 1 :(得分:1)

解决方案第一: 。能否请您尝试关注一下,让我知道这是否对您有帮助。

d/g/l
f/h
i/l/s/d

输出如下。

awk -F":" '
{
  for(i=1;i<=NF;i++){
    if($i){ val=(val?val:"")substr($i,length($i)) }
  }
  print val;
  val=""
}' Input_file

第二种解决方案: :在输出字符串之间插入dgl fh ilsd

/

输出如下。

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

解决方案3rd: :使用d/g/l f/h i/l/s/d 的{​​{1}}实用程序。

match

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed -r 's/[^:]*([^:]):+|:+/\1/g;s/\B/\//g' file

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

答案 3 :(得分:0)

Perl和否定前瞻:

$ perl -p -e 's/.(?!:)//g' file
dgl
fh
ilsd

答案 4 :(得分:0)

使用perl

更容易
$ cat ip.txt
:hd:fg:kl:
:df:lkjh:
:glki:l:s:d:

$ perl -lne 'print join "/", /.(?=:)/g' ip.txt
d/g/l
f/h
i/l/s/d
  • /.(?=:)/g获取:之前的所有字符
  • 然后使用/作为分隔符字符串打印结果匹配项

答案 5 :(得分:0)

所有人都使用ERE

sed -E 's#[^:]*(.):#\1/#g;s/^.|.$//g' infile

答案 6 :(得分:0)

使用GNU sed:

sed -E 's/[^:]*([^:]):/\1/g; s/([^:])/\/\1/g; s/^:\///'

第一个命令s/[^:]*([^:]):/\1/g match除去多余的字符和冒号(第一个除外),因此产生以下内容:

:dgl
:fh
:ilsd

第二个命令s/([^:])/\/\1/g在每个字符前插入一个/,产生:

:/d/g/l
:/f/h
:/i/l/s/d

最后一条命令s/^:\///只是从每一行的开头删除了:/

d/g/l
f/h
i/l/s/d

答案 7 :(得分:0)

您可以使用gawk从第二个字符开始遍历每一行。每次迭代器在冒号上打上前一个字符。

$ awk <file.txt '{for(i=2;i<=length($0);i++) { \
                    if (substr($0,i,1)==":") printf substr($0,i-1,1);} printf "\n";}'
dgl
fh
ilsd