我只需要在使用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'
,但似乎无法正常工作。
感谢所有回复。
答案 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]
。