linux - 将第一列内容和前缀附加到行尾

标签 linux bash sed

我正在尝试将列内容附加到每行的末尾。例如,我有:

0,John L Doe,Street,City 

1,Jane L Doe,Street,City

2,John L Doe,Street,City

3,John L Doe,Street,City

4,Jane L Doe,Street,City

5,John L Doe,Street,City

6,John L Doe,Street,City

7,Jane L Doe,Street,City

尝试将以逗号分隔的第一列附加到包括字符“I”的每一行的末尾,成为:

0,John L Doe,Street,City I0

1,Jane L Doe,Street,City I1

2,John L Doe,Street,City I2

3,John L Doe,Street,City I3

4,Jane L Doe,Street,City I4

5,John L Doe,Street,City I5

6,John L Doe,Street,City I6

7,Jane L Doe,Street,City I7

添加“I”很容易添加:sed 's/$/I/' 文件,但我在复制和附加第一列内容时遇到问题

最佳答案

尝试:

$ sed -E 's/([[:digit:]]+),.*$/& I\1/' file
0,John L Doe,Street,City I0
1,Jane L Doe,Street,City I1
2,John L Doe,Street,City I2
3,John L Doe,Street,City I3
4,Jane L Doe,Street,City I4
5,John L Doe,Street,City I5
6,John L Doe,Street,City I6
7,Jane L Doe,Street,City I7

正则表达式 ([[:digit:]]+),.*$ 匹配从该行的第一个数字到该行的末尾。表达式 ([[:digit:]]+) 匹配第一个逗号之前的所有数字,并将它们保存在组 1 中。替换文本是 & I\1,其中sed 将 & 替换为整个匹配并将 \1 替换为第 1 组。

-E 选项告诉 sed 使用扩展正则表达式 (ERE) 而不是默认的基本正则表达式 (BRE)。

实际上,不需要匹配行尾的$。因为 sed 正则表达式总是最左边最长的匹配项,所以我们的正则表达式无论如何都会匹配到行尾。所以,我们可以使用稍微简单一点的:

sed -E 's/([[:digit:]]+),.*/& I\1/' file

兼容性

以上应该适用于所有现代 sed。对于较旧的 GNU sed,将 -E 替换为 -r:

sed -r 's/([[:digit:]]+),.*/& I\1/' file

关于linux - 将第一列内容和前缀附加到行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49091894/

相关文章:

linux - 终端命令编写中的 VIM 功能

linux - Pango-1.40.1 : Error while compiling on Wind River Linux

linux - 如何进行Linux源码定制?

linux - 验证 BASH 脚本时出现问题

arrays - 使用 bash 在数组中旋转值

unix - sed/awk : Insert some text in a file after the last pattern found

macos - 使用 sed 命令从多个文件中删除行

linux - 在 Linux 上使用静态链接的应用程序有什么缺点吗?

Linux shell 脚本通过用户输入搜索日志

regex - 从第一个点之前的子字符串中删除双引号