使用 sed 仅更改子字符串的一部分

sci*_*cho 3 sed

我有一个包含从某处复制的数字的文件。它看起来像这样:

{02   12     04 01 07 10 11 06 08 05 03    15     13     00    14     09},
{14   11     02 12 04 07 13 01 05 00 15    10     03     09    08     06},
{04   02     01 11 10 13 07 08 15 09 12    05     06     03    00     14},
{11   08     12 07 01 14 02 13 06 15 00    09     10     04    05     03}
Run Code Online (Sandbox Code Playgroud)

我现在必须在每个数字后添加逗号(基本上是为了使其成为 C++ 数组),但正如您所见,这样做可能非常乏味,尤其是当您有很多数字时。

我尝试使用 sed 像:
cat file.txt | sed -r "s/ /, /g"

但是,如果我使用它,我将用 ',space' 替换每个“空格”,并且我只想用 ',' 替换数字后面的空格

如果我使用cat file.txt | sed -r "s/[0123456789] /, /g",我将无法在更换前获得相同的号码。因此,我只想更改子字符串的某些部分。

我该怎么做呢?

小智 6

cat file.txt | sed -r 's/([0-9]+)/\1,/g'

{02,   12,     04, 01, 07, 10, 11, 06, 08, 05, 03,    15,     13,     00,    14,     09,},
{14,   11,     02, 12, 04, 07, 13, 01, 05, 00, 15,    10,     03,     09,    08,     06,},
{04,   02,     01, 11, 10, 13, 07, 08, 15, 09, 12,    05,     06,     03,    00,     14,},
{11,   08,     12, 07, 01, 14, 02, 13, 06, 15, 00,    09,     10,     04,    05,     03,}
Run Code Online (Sandbox Code Playgroud)

解释:

First capturing group ([0-9]+)

Match a single character (i.e. number) present in the table [0-9]+ 
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
0-9 a single character in the range between 0 (index 48) and 9 (index 57) (case sensitive)

In other words, the [0-9]+ pattern matches an integer number (without decimals) even Inside longer strings, even words.
\1 is called a "back reference" or "special escapes" in the sed documentation. It refers to the corresponding matching sub-expressions in the regexp. In other words, in this example, it inserts the contents of each captured number in the table followed by comma.
Run Code Online (Sandbox Code Playgroud)

  • `\1` 在 `sed` 文档中被称为“反向引用”。 (2认同)
  • `sed` 可以读取文件。 (2认同)