Awk 用字符替换特定列中的空格

Awk 用字符替换特定列中的空格,awk,sed,Awk,Sed,我有格式的数据 A ((!(A1+A2))) B (A1+A2) C (A1 A2) D (!(A1 A2) B1) E (!A1+!A2) F ((A1+A2) A3 A4) G ((A1 A2)+(A3 A4)) 我希望输出为 A ((!(A1+A2))) B (A1+A2) C (A1&A2) D (!(A1&A2)&B1 E (!A1+!A2) F ((A1+A2)&A3&A4) G ((A1&A2)+(A3&

我有格式的数据

A  ((!(A1+A2)))
B  (A1+A2)
C  (A1 A2)
D  (!(A1 A2) B1)
E  (!A1+!A2)
F  ((A1+A2) A3 A4)
G  ((A1 A2)+(A3 A4))
我希望输出为

A  ((!(A1+A2)))
B  (A1+A2)
C  (A1&A2)
D  (!(A1&A2)&B1
E  (!A1+!A2)
F  ((A1+A2)&A3&A4)
G  ((A1&A2)+(A3&A4))
因此,每当第2列中有空格时,我希望它被替换为
&
我试过了

但是没有变化 我也试过了

awk -F' ' '{if($2==" ")$2="&";}1' file

这也不会改变仅返回输入文件。

您可以使用此
awk
和2个空格作为输入/输出字段分隔符:

awk'BEGIN{FS=OFS=”“}{gsub(+/+/,“\\&”,$2)}1文件
A((!(A1+A2)))
B(A1+A2)
C(A1和A2)
D(!(A1和A2)和B1)
E(!A1+!A2)
F((A1+A2)和A3&A4)
G((A1和A2)+(A3和A4))

您可以通过以下方式利用
sed
完成此任务:

sed 's/\([^ ]\) \([^ ]\)/\1\&\2/g'
提供输入

A  ((!(A1+A2)))
B  (A1+A2)
C  (A1 A2)
D  (!(A1 A2) B1)
E  (!A1+!A2)
F  ((A1+A2) A3 A4)
G  ((A1 A2)+(A3 A4))
输出

A  ((!(A1+A2)))
B  (A1+A2)
C  (A1&A2)
D  (!(A1&A2)&B1)
E  (!A1+!A2)
F  ((A1+A2)&A3&A4)
G  ((A1&A2)+(A3&A4))

说明:我在这里使用了捕获组,第一个是除空格之外的任何字符,第二个也是除空格之外的任何字符,它们之间有空格,这样的匹配被第一个组的内容(
\1
)替换,然后是第二个组的内容(
\2
)。请注意,我们需要多次替换,因此
g
。免责声明:此解决方案假设您的输入中没有前导空格或尾随空格。

想想看-当您将字段分隔符设置为空字符(
-F'
)时,$2或任何其他字段怎么可能是空字符(
$2==“”
)?
A  ((!(A1+A2)))
B  (A1+A2)
C  (A1&A2)
D  (!(A1&A2)&B1)
E  (!A1+!A2)
F  ((A1+A2)&A3&A4)
G  ((A1&A2)+(A3&A4))