用sed删除字符

时间:2017-06-01 00:58:38

标签: bash sed

我有一个包含以下行的文件:

  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

感谢您的帮助。

3 个答案:

答案 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