我有一个包含以下行的文件:
1 1b0c1375c901dc8b3cc162010dc2691ca256c765
1 1b0c19c226e87899a0060e058e366fbbf4148ab4
1 1b0d1bb9f81763c679b54eac9e816a5e45dace79
1 1b0d59faa9f62150a38670c59599bdc31f3094b5
1 1b0d6a8132667ce07d7479913a85ec057331a816
一般来说:
我想以这种格式转换它们:
1,1b0c1375c901dc8b3cc162010dc2691ca256c765
1,1b0c19c226e87899a0060e058e366fbbf4148ab4
1,1b0d1bb9f81763c679b54eac9e816a5e45dace79
1,1b0d59faa9f62150a38670c59599bdc31f3094b5
1,1b0d6a8132667ce07d7479913a85ec057331a816
我已经尝试过这个命令行,但无法取得成功:
sed 's/^ *\([0-9]*\) \([0-9a-zA-Z]*\)$/\1,\2/' file
感谢您的帮助。
答案 0 :(得分:0)
鉴于输入是基于字段的,awk
允许一个简单的解决方案:
awk -v OFS=, '$2=$2' file
awk
默认情况下通过空格运行将输入行分为字段,修剪前导和尾随运行。
因此,$1
指的是输入文件的第1列,$2
指的是第2列。
-v OFS=,
告诉awk
在输出上分隔,
字段(特殊变量OFS
是 o utput f ield s eparator)。
$2=$2
是一个具有重要副作用的虚拟赋值,但是:它会导致awk
使用OFS
作为分隔符从其组成字段重建当前行
因为赋值的结果是除0
以外的非空字符串,所以在Boolen上下文中,赋值被认为是(概念上) true {...}
是 - 在Awk术语中是模式。
默认情况下打印的模式评估为 true 没有关联的操作({ ... }
) - 使用,
- 分隔的字段重建 - 在手边。
至于您尝试的内容:
sed 's/^ ([0-9]) ([0-9a-zA-Z]*)$/\1,\2/' file # DOESN'T WORK
您只在行的开头匹配 1 空间,而您的输入有多个。
默认情况下 - 与POSIX一致 - sed
仅支持基本正则表达式,其中 - 反直觉地,这些天 - 包含{{1}的捕获组}和(
必须表示为)
和\(
。
符合POSIX标准的重新制定将是:
\)
但是,如果您使用的是Linux( GNU sed 's/^ *\([0-9]\) \([0-9a-zA-Z]*\)$/\1,\2/' file
)或BSD / macOS,则可以使用选项sed
启用现代扩展正则表达式,其中-E
和(
按预期工作:
)
答案 1 :(得分:0)
修改强>
我猜,因为缺乏对某些空间的考虑而无法工作
sed -e 's/..\([0-9]\)\{1\} \([0-9a-zA-Z]*\)$/\1,\2/g' test.txt
答案 2 :(得分:0)
如果每行前面都有空格。
sed -r 's/^\s+//g;s/\s/,/' input
1,1b0c1375c901dc8b3cc162010dc2691ca256c765
1,1b0c19c226e87899a0060e058e366fbbf4148ab4
1,1b0d1bb9f81763c679b54eac9e816a5e45dace79
1,1b0d59faa9f62150a38670c59599bdc31f3094b5
1,1b0d6a8132667ce07d7479913a85ec057331a816
如果没有前导空白,那么以下是足够的:
sed -r 's/\s/,/' input