【问题标题】:How do I swap number position such as 4th position to 7th position?如何将数字位置(例如第 4 位置)交换到第 7 位置?
【发布时间】:2019-07-03 07:51:55
【问题描述】:

示例编号:

12345678

我的尝试:

sed 's/\(.\)\(.\)/\2\1/'

我的结果:

21345678

这里的这一行将交换数字的第一个位置和第二个位置。我似乎不知道如何处理进一步的职位。

【问题讨论】:

标签: linux sed


【解决方案1】:

您可以将第 4 个字母和第 7 个字母交换为:

sed 's/\([0-9]\{3\}\)\([0-9]\)\([0-9]\{2\}\)\([0-9]\)/\1\4\3\2/' <<< "12345678"

输出:

12375648

【讨论】:

  • 绝对是的。
【解决方案2】:

您只需对其进行修改以捕获更多组,并以所需的顺序输出它们:

sed 's/^(...)(.)(..)(.)/\1\4\3\2/'
#      |  |   |  |   |
#      |  |   |  |   +- digit #7(\4)
#      |  |   |  +----- 2 chars (\3)
#      |  |   +-------- digit #4 (\2)
#      |  +------------ 3 chars (\1)
#      +--------------- start-of-line anchor

请记住,这是最简单的情况,您只想交换字符位置,而不管它们是否为数字。您可以轻松地重新扩展字符类以限制交换的内容,但我在这里的目的只是展示实现交换的最简单方法。

【讨论】:

  • 谢谢。我刚刚开始,所以一切对我来说都是新的
  • 我建议添加选项-E-r
【解决方案3】:

使用awk 似乎更干净:

$ echo 12345678 | awk '{t=$4; $4=$7; $7=t}1' FS= OFS=
12375648

【讨论】:

  • 将 FS 设置为 null 的效果是每个 POSIX 的未定义行为。它会在 gawk 和其他一些 awk 中做你想做的事,但在其他一些 awk 中它仍然会做其他事情,例如将整个输入行视为单个字段。
【解决方案4】:

这可能对你有用(GNU sed):

sed -E 's/./\n&/7;s//\n&/4;s/\n(.)(.*)\n(.)/\3\2\1/' file

在字符位置引入换行符并使用模式匹配来交换这些字符。

注意替换的正常流程必须颠倒,否则引入的换行符会影响原始字符串的长度。

【讨论】:

    【解决方案5】:

    使用通过 -E 选项支持 ERE 的 sed,例如GNU sed 和 OSX/BSD sed:

    $ echo '12345678' | sed -E 's/(.{3})(.)(.{2})(.)/\1\4\3\2/'
    12375648
    

    【讨论】:

      猜你喜欢
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      相关资源
      最近更新 更多