【问题标题】:replace a pipe delimiter with a space using awk or sed使用 awk 或 sed 将管道分隔符替换为空格
【发布时间】:2015-10-28 05:34:22
【问题描述】:

我有一个带有如下示例行的管道分隔文件;

/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

【问题讨论】:

  • 您的输入和输出似乎与我相同。您愿意更新您的问题吗?
  • 在输入上,月份和日期(10 月 23 日)之间有一个管道,而在输出上,它需要用空格替换(10 月 23 日)

标签: regex bash awk sed


【解决方案1】:

使用 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|10 月 23 日|14:04|3919089454 /u/chaintrk/bri/sh/generate_ct2020.pl|-rwxrwxr-x|bdr|bdr|15916|10 月 23 日|14:04|957147508

如果您想“就地”编辑文件,请添加 sed 的选项 -i

【讨论】:

  • 我在尝试时得到了一个无效选项 sed -E 's/(\|[A-Z][a-z]{2})\|([0-9]{1,2}\ |)/\1 \2/'​​ testlist.txt sed: 无效选项 -- E
  • 用非 GNU sed 试试这个:sed 's/\(|[A-Z][a-z][a-z]\)|\([0-9]\+|\)/\1 \2/' file
  • 感谢它的工作。您能否解释一下该命令如何区分它将从行中替换哪个管道。
  • 我使用了一个正则表达式来描述要搜索和替换的内容。搜索一个竖线,然后是一个大写字母,然后是两个小写字母,然后是竖线,然后是至少一个数字,然后是竖线。另见:The Stack Overflow Regular Expressions FAQ
  • @Cyrus 请将正则表达式解释添加到您的答案中,这将对未来的读者有用。谢谢。
【解决方案2】:

是的,可以更改“|”带空格。
真正的问题是确定要更改哪些字段。

那些总是第 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

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 2017-04-23
    • 2013-11-03
    • 2017-08-13
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多