用于根据分隔符的位置在分隔符内替换的 UNIX 命令

use*_*074 5 sed awk perl text-processing cut

我有一个带有|[pipe] 分隔符的输入字符串,并且喜欢按&字符替换第 3 列和第 5 列的空字符串。

输入文件:

a a|b b|c c|d d|e e
f f|g g|h h|i i|j j
Run Code Online (Sandbox Code Playgroud)

输出文件:

a a|b b|c&c|d d|e&e
f f|g g|h&h|i i|j&j
Run Code Online (Sandbox Code Playgroud)

您可以看到之间的空格cc, ee, hh and jj被替换为& 我有一个替代解决方案,该解决方案涉及使用while 循环读取文件并使用cut基于分隔符的命令并将其存储在基于位置的变量中,并使用“&”替换空格sed并附加所有拆分的将变量放入一个变量并将其附加到一个新文件中。是否有单个命令可用于实现此目的?

αғs*_*нιη 12

使用awk此:

awk -F\| '{gsub(" ","\\&",$3); gsub(" ","\\&",$5)}1' OFS=\| infile.txt 
Run Code Online (Sandbox Code Playgroud)


Phi*_*pos 8

你可以做

sed 's/\(|[^| ]*\) */\1\&/4;s//\1\&/2'
Run Code Online (Sandbox Code Playgroud)

对于你的例子。解释:

|[^| ]*搜索您的字段分隔符和该列中的所有非空格。它与分组在一起,\(\)以便以后可以将其复制到替换\1。然后一个或多个空格将被替换为&,需要在替换字符串中对其进行转义。的4手段来应用此到第四occurence这是第五列。然后2对第三列重复它。您不需要通过提供空模式来重复模式。

如果列中可能有多个空格或根本没有空格,则更复杂。然后最好使用不同的工具,如awk.

另一方面,如果您知道每列中总是有一个空格,请执行一个简单的

sed 's/ /\&/5;s//\&/3'
Run Code Online (Sandbox Code Playgroud)


小智 7

perl -aF'(\|)' -lne 's/\h/&/ for @F[2*2,2*4]; print @F' input_file
Run Code Online (Sandbox Code Playgroud)

结果

a a|b b|c&c|d d|e&e
f f|g g|h&h|i i|j&j
Run Code Online (Sandbox Code Playgroud)

在职的

拆分管道上的当前记录,|并在字段中包含分隔符。因此,第 3 和第 5 个字段变为 2*2 和 2*4 字段。

对于这两个字段,我们用\h文字替换水平空白&。完成后,只需打印字段。