我正在尝试使用标准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 I
和Step II
呢?
亲切的问候
发布于 2018-07-04 10:06:52
下面是什么:
awk 'BEGIN{FS=":"}{for(i=1;i<NF;i++){if(i>2)printf"/";printf substr($i,length($i))}print""}' input.txt
input.txt:
:hd:fg:kl:
:df:lkjh:
:glki:l:s:d:
输出:
d/g/l
f/h
i/l/s/d
发布于 2018-07-04 10:07:57
Solution Could:你可以试着关注一下,让我知道这是否对你有帮助。
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
解决方案2:输出字符串之间带有/
的。
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
输出如下所示。
d/g/l
f/h
i/l/s/d
解决方案3:和awk
的match
实用程序。
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
发布于 2018-07-04 09:43:43
这可能适用于您(GNU sed):
sed -r 's/[^:]*([^:]):+|:+/\1/g;s/\B/\//g' file
将零个或多个非:
替换为整行中的单个字符,然后在每个字符之间插入一个:
。
https://stackoverflow.com/questions/51164358
复制相似问题