【问题标题】:Bash: Flip strings to the other side of the delimiterBash:将字符串翻转到分隔符的另一侧
【发布时间】:2020-03-26 05:53:05
【问题描述】:

基本上,我有一个格式如下的文件

ABC:123

我想翻转分隔符周围的字符串,所以它看起来像这样

123:ABC

我更喜欢用 bash/linux 工具来做这件事。

感谢您的帮助!

【问题讨论】:

    标签: linux bash parsing grep formatting


    【解决方案1】:

    使用内部 bash 命令相当容易,假设有两个字段,根据以下记录:

    pax:~$ x='abc:123'
    pax:~$ echo "${x#*:}:${x%:*}"
    123:abc
    

    第一个替换 ${x#*:} 删除了从开始到冒号的所有内容。第二个,${x%:*},删除从冒号到末尾的所有内容。

    然后你只需用冒号重新加入它们。

    对于您的特定数据并不重要,但%# 使用尽可能短的模式。 %%## 变体将为您提供尽可能长的模式(贪婪)。


    顺便说一句,如果您一次只处理一个字符串,这是理想的,因为您不需要启动外部进程来为您完成工作。但是,如果您正在处理整个文件,有更好的方法可以做到这一点,例如使用awk

    pax:~$ printf "abc:123\ndef:456\nghi:789\n" | awk -F: '{print $2 FS $1}'
    123:abc
    456:def
    789:ghi
    

    【讨论】:

      【解决方案2】:
      #!/bin/sh -x
      
      var1=$(echo -e 'ABC:123' | cut -d':' -f1) 
      var2=$(echo -e 'ABC:123' | cut -d':' -f2)
      echo -e "${var2}":"${var1}"
      

      我使用 cut 将字符串分成两部分,并将这两部分存储为变量。

      从那里,可以使用 echo 重新排列您认为合适的变量。

      【讨论】:

      • 虽然这段代码可能会解决问题,但一个好的答案还应该解释它的作用以及它如何提供帮助?
      【解决方案3】:

      使用sed

      sed -E 's/(.*):(.*)/\2:\1/' file.txt
      

      pastecut 与进程替换一起使用。

      paste -d: <(cut -d : -f2 file.txt) <(cut -d : -f1 file.txt)
      

      针对大量数据/文件的较慢/最慢的 shell 解决方案。

      while IFS=: read -r left rigth; do printf '%s:%s\n' "$rigth" "$left"; done < file.txt
      

      【讨论】:

        猜你喜欢
        • 2012-11-08
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 2016-12-27
        • 1970-01-01
        相关资源
        最近更新 更多