我正在尝试使用标准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 I
和Step II
。
问候
答案 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
获取:
之前的所有字符
(?=:)
是lookahead construct /
作为分隔符字符串打印结果匹配项答案 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