使用awk或sed

时间:2015-10-28 05:34:22

标签: regex bash awk sed

我有一个管道分隔文件,其中包含如下所示的示例行;

/u/chaintrk/bri/sh/picklist_autoprint.sh|-rwxrwxr-x|bdr|bdr|2665|Oct|23|14:04|3919089454
/u/chaintrk/bri/sh/generate_ct2020.pl|-rwxrwxr-x|bdr|bdr|15916|Oct|23|14:04|957147508

是否有一种方法可以将awk或sed转换为输出,如下所示,月份和日期之间的管道被空格替换?

/u/chaintrk/bri/sh/picklist_autoprint.sh|-rwxrwxr-x|bdr|bdr|2665|Oct 23|14:04|3919089454
/u/chaintrk/bri/sh/generate_ct2020.pl|-rwxrwxr-x|bdr|bdr|15916|Oct 23|14:04|957147508

2 个答案:

答案 0 :(得分:0)

使用GNU sed:

sed -E 's/(\|[A-Z][a-z]{2})\|([0-9]{1,2}\|)/\1 \2/' file

输出:

/u/chaintrk/bri/sh/picklist_autoprint.sh|-rwxrwxr-x|bdr|bdr|2665|Oct 23|14:04|3919089454
/u/chaintrk/bri/sh/generate_ct2020.pl|-rwxrwxr-x|bdr|bdr|15916|Oct 23|14:04|957147508

如果你想编辑文件"就地"添加sed的选项-i

答案 1 :(得分:0)

是的,可以更改“|”有空间。
真正的问题是确定要改变的哪个领域。

那些总是第6和第7吗?如果是这样,这有效:

awk -vFS='|' '{sub($6"|"$7,$6" "$7)}1' file

那些文字Upper-lower-lower后跟1 or 2 digits的人? 如果是这样,其他的工作:

gawk '{c="[|]([[:upper:]][[:lower:]]{2})[|]([0-9]{1,2})[|]";print gensub(c,"|\\1 \\2|",1,$0)}' file