如何仅交换每一行中的数值

时间:2019-04-22 23:25:28

标签: linux bash sed scripting

我只需要在使用sed的特定字符串“ PIC”之后的每一行中交换数字值。 例如:

hello PIC A(12), and this PIC B(11)

所需的输出是:

hello PIC B(11), and this PIC A(12)

字符“ B”和“ A”在其他行中可能有所不同,但是字符串PIC始终存在。

我正在尝试使用sed命令:

echo "hello PIC A(12), and this PIC B(11)" | sed '/PIC X(12)/s/PIC X(12)/PIC X(11)/g'

,但似乎无法正常工作。

感谢所有回复。

3 个答案:

答案 0 :(得分:2)

您可以直接使用substitute命令,因为它只会更改找到匹配项的行。

使用此POSIX ERE

sed -E 's/(PIC )([A-Z]\([0-9]+\))(.*PIC )([A-Z]\([0-9]+\))/\1\4\3\2/'

或者,POSIX BRE

sed 's/\(PIC \)\([A-Z]([0-9]*)\)\(.*PIC \)\([A-Z]([0-9]*)\)/\1\4\3\2/'

两个版本的转义括号不同:在POSIX BRE中,\(...\)表示捕获组,并且()匹配文字括号,而在POSIX ERE中,反之亦然

POSIX ERE模式的详细信息:

  • (PIC )-第1组:PIC和空格
  • ([A-Z]\([0-9]+\))-第2组:任意大写ASCII字母,(,1个以上的数字,)
  • (.*PIC )-第3组:任意0个或多个字符,PIC,空格
  • ([A-Z]\([0-9]+\))-第4组:大写字母(,1个以上的数字)

答案 1 :(得分:1)

如果“ d”文件中的数据,请尝试使用gnu sed

sed -E 's/(hello PIC )(\w+)(\S+, and this PIC )(\w+)/\1\4\3\2/' d

答案 2 :(得分:1)

使用任何POSIX sed:

$ sed 's/\(PIC [[:upper:]]([0-9]*)\)\(.*\)\(PIC [[:upper:]]([0-9]*)\)/\3\2\1/' file
hello PIC B(11), and this PIC A(12)

如果您没有POSIX sed(例如,Solaris上的旧sed),请设置LC_ALL=C并将[:upper:]更改为[A-Z]