【问题标题】:Unix: multi and single character delimiter in cut or awk commandsUnix:cut 或 awk 命令中的多字符和单字符分隔符
【发布时间】:2021-05-14 19:52:21
【问题描述】:

这是我的字符串:

my_file1.txt-myfile2.txt_my_file3.txt

我想删除第一个“.txt”之后的第一个“_”之后的所有字符。

从上面的例子中,我希望输出为my_file1.txt-myfile2.txt。我必须搜索第一次出现的“.txt”并继续解析,直到找到下划线字符,然后从那里删除所有内容。

是否可以在 sed/awk/cut 等命令中做到这一点?

【问题讨论】:

  • 从您收到的一些答案中可以看出,您的示例并未充分测试您的要求。现在,各种脚本可以从您发布的示例输入中生成您发布的预期输出,而无需实际执行您想要的操作,即remove all the characters after the first "_" that follows the first ".txt"。提供多行示例输入/输出通常是一个好主意,这样我们就可以根据这些示例涵盖的全部要求充分测试潜在的解决方案。

标签: unix awk sed cut


【解决方案1】:

cut 无法完成这项工作,但 sed 和 awk 可以:

$ sed 's/\.txt/\n/g; s/\([^\n]*\n[^_]*\)_.*/\1/; s/\n/.txt/g' file
my_file1.txt-myfile2.txt

$ awk 'match($0,/\.txt[^_]*_/){print substr($0,1,RSTART+RLENGTH-2)}' file
my_file1.txt-myfile2.txt

【讨论】:

  • 如果您能解释一下您使用的 sed 命令,对读者非常有用。
  • 我认为这是非常常见的惯用 sed - 看了一眼手册页后,您有没有不明白的部分?
【解决方案2】:

您能否尝试以下,根据您显示的示例编写。

awk '{sub(/\.txt_.*/,".txt")} 1' Input_file

只需将 .txt_ 到最后一行的所有内容替换为 .txt 并在此处打印该行

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2014-10-14
    • 2012-12-28
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多