Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中修改字符串_Bash_Shell_Terminal - Fatal编程技术网

在bash中修改字符串

在bash中修改字符串,bash,shell,terminal,Bash,Shell,Terminal,我有bashshell脚本来修改字符串 我想从字符串44[tip]3764d6b8ae82 2014-04-01 16:34+0400 igor中获取14040116 YYMMDDHH 我当前的脚本看起来像 raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor" hg_date=`echo $raw_info | cut -d' ' -f 3` hg_date=${hg_date//-/} hg_date=${hg_date:2}

我有bashshell脚本来修改字符串

我想从字符串44[tip]3764d6b8ae82 2014-04-01 16:34+0400 igor中获取14040116 YYMMDDHH

我当前的脚本看起来像

raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"

hg_date=`echo $raw_info | cut -d' ' -f 3`
hg_date=${hg_date//-/}
hg_date=${hg_date:2}
hg_hour=`echo $raw_info | cut -d' ' -f 4 | cut -d':' -f 1`

hg_rev=${hg_date}${hg_hour}

它可以工作,但可以更短吗?

您可以获取字符串中日期所在的特定部分,然后使用日期格式控件正确打印:

$ raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"
$ date -d"$(cut -d' ' -f3-4 <<< "$raw_info")" "+%y%m%d%H"
14040116
按件:

$ cut -d' ' -f3-4 <<< "$raw_info"   #get 3rd and 4th fields from the string
2014-04-01 16:34

$ date -d"2014-04-01 16:34" "+%y%m%d%H"  #convert date into YYMMDDHH format
14040116

您可以获取字符串中日期所在的特定部分,然后使用日期格式控件将其正确打印:

$ raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"
$ date -d"$(cut -d' ' -f3-4 <<< "$raw_info")" "+%y%m%d%H"
14040116
按件:

$ cut -d' ' -f3-4 <<< "$raw_info"   #get 3rd and 4th fields from the string
2014-04-01 16:34

$ date -d"2014-04-01 16:34" "+%y%m%d%H"  #convert date into YYMMDDHH format
14040116
这里有一个awk解决方案

echo "44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor" | awk '{split($3,a,"-");split($4,b,":");print substr(a[1],3,2)a[2]a[3]b[1]}'
14040116
拆分$3,a,-将第三个字段除以-,因此2014-04-01给出了a[1]=2014,a[2]=04,a[3]=01。 拆分$4,b,:将第四个字段除以:,因此16:34得到b[1]=16,b[2]=34。 然后打印:

substra[1],3,2给出了2014年的最后两位数字,即14。 a[2]a[3]b[1]给出14040116。 这里有一个awk解决方案

echo "44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor" | awk '{split($3,a,"-");split($4,b,":");print substr(a[1],3,2)a[2]a[3]b[1]}'
14040116
拆分$3,a,-将第三个字段除以-,因此2014-04-01给出了a[1]=2014,a[2]=04,a[3]=01。 拆分$4,b,:将第四个字段除以:,因此16:34得到b[1]=16,b[2]=34。 然后打印:

substra[1],3,2给出了2014年的最后两位数字,即14。 a[2]a[3]b[1]给出14040116。
虽然IMHO@fedorqui的解决方案是最好的,但您也可以使用sed,例如


Ps:它取决于两位数格式和2xxx年

虽然IMHO@fedorqui的解决方案是最好的,但您也可以使用sed,例如


Ps:它依赖于两位数格式和2xxx年

到目前为止给出的每个解决方案都在调用外部命令,因此效率低下

更有效的方法是使用bash的内置字符串操作工具

raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"
read -r tip_name hash ymd hour _ <<<"$raw_info"
hg_rev="${ymd:2:2}${ymd:5:2}${ymd:8:2}${hour%%:*}"

迄今为止给出的每个解决方案都在调用外部命令,因此效率低下

更有效的方法是使用bash的内置字符串操作工具

raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"
read -r tip_name hash ymd hour _ <<<"$raw_info"
hg_rev="${ymd:2:2}${ymd:5:2}${ymd:8:2}${hour%%:*}"

你为什么在这里使用cut而不是PE?…不管怎样,最终选择添加我自己的答案。啊,参数扩展!你为什么在这里使用cut而不是PE?…不管怎样,最终选择添加我自己的答案。啊,参数扩展!