【问题标题】:Print everything before relevant symbol and keep 1 character after relevant symbol打印相关符号之前的所有内容,并在相关符号之后保留 1 个字符
【发布时间】:2019-09-09 22:59:54
【问题描述】:

我正在尝试找到一个单行来打印相关符号之前的每个字符,并在相关符号之后仅保留 1 个字符:

输入:

thisis#atest
thisisjust#anothertest
just#testing

期望的输出:

thisis#a
thisjust#a
just#t

awk -F"#" '{print $1 "#" }' 几乎会给我我想要的,但我还需要找到一种方法来打印第二个字符。有什么想法吗?

【问题讨论】:

  • 如果没有#怎么办?如果# 后面没有字符怎么办?如果一行中有 2 个#s 怎么办?等等,等等。如果您想要一个强大的解决方案,然后发布示例输入/输出,涵盖您的所有用例,而不仅仅是一个、最微不足道、最佳情况的场景..

标签: regex linux awk sed


【解决方案1】:

您可以用 sed 替换 # 之后的第一个字符之后的内容:

sed 's/\(#.\).*/\1/'

【讨论】:

  • 一个小变化sed -r 's/(#.).*/\1/' file(少转义)
【解决方案2】:

你可以使用 grep:

$ grep -o '[^#]*#.' infile
thisis#a
thisisjust#a
just#t

这匹配除# 之外的一系列字符,后跟# 和任何字符。 -o 选项仅保留匹配项本身。

【讨论】:

    【解决方案3】:

    使用 GNU 的 awk 中的特殊 RT 变量,您可以:

    awk 'BEGIN{RS="#.|\n"}RT!="\n"{print $0 RT}'
    

    【讨论】:

      【解决方案4】:

      获取'#'的索引,然后拉出子串。

      $ awk '{print substr($0,1,index($0,"#")+1);}' in.txt 
      thisis#a
      thisisjust#a
      just#t
      

      【讨论】:

        【解决方案5】:

        第一种解决方案:请您尝试以下方法。

        awk 'match($0,/[^#]*#./){print substr($0,RSTART,RLENGTH)}'  Input_file
        

        上面将根据您的要求打印其中包含 # 的行,并留下没有它的行,以防您想完全打印这些行,然后使用以下内容。

        awk 'match($0,/[^#]*#./){print substr($0,RSTART,RLENGTH);next} 1'  Input_file
        

        第二个解决方案:

        awk 'BEGIN{FS=OFS="#"} {print $1,substr($2,1,1)}'  Input_file
        

        【讨论】:

        • @bobylapointe,您能否检查这些解决方案并让我知道它们是否有帮助?
        【解决方案6】:

        Ravindes 第二个例子的一些小变化

        awk -F# '{print $1"#"substr($2,1,1)}' file
        awk -F# '{print $1FS substr($2,1,1)}' file
        

        另一个grep 变体(迄今为止发布的最短):

        grep -oP '.+?#.' file
        
        • o 仅打印匹配
        • PPerl 正则表达式(由于+?
        • . 任意字符
        • +
        • ? 但停在:
        • #
        • . 再加一个字符

        如果我们不添加?。这条线 test#one#two 变为 test#one#t 而不是 test#o 对贪婪的 + 进行操作

        【讨论】:

          【解决方案7】:

          如果你想使用 awk,最简洁的方法是使用 index 查找字符的位置:

          awk 'n=index($0,'#') { print substr($0,1,n+1) }' file
          

          不过,有一些更短、更专用的工具可用于此目的。查看其他答案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-12-04
            • 1970-01-01
            • 2017-09-12
            • 2020-01-06
            • 1970-01-01
            • 2018-07-04
            • 2022-06-11
            • 2022-09-29
            相关资源
            最近更新 更多