如何将数字位置(例如第4位)交换为第7位?

时间:2019-02-09 04:14:46

标签: linux sed

示例编号:

12345678

我的尝试:

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

我的结果:

21345678

此行将交换数字的第一位置和第二位置。我似乎还不知道该如何处理其他职位。

5 个答案:

答案 0 :(得分:1)

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

$isReviewed = ProjectUser::where('user_id', Auth::user()->id) ->select(DB::raw('(CASE WHEN is_reviewed = 0 THEN "0" ELSE "1" END)'))->first()->is_reviewd; 

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

答案 1 :(得分:1)

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

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

输出:

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

答案 2 :(得分:1)

似乎更清洁使用awk

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

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

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