从文件中的特定行中删除连字符

时间:2011-09-15 20:42:49

标签: sed awk

我有一个数据文件,需要删除连字符的几个uniq标识符。

所以我有:

(Special_Section "data-values")

我希望将其替换为:

(Special_Section "datavalues")

我想使用简单的sed find / replace,但每次数据和值都不同。最好是,我会在原地运行,因为该文件还有很多我想保持的其他信息。

sed或awk是否有办法仅从匹配部分删除连字符?

目前我可以匹配:sed -i 's/Special_Section "[a-zA-Z0-9]*-[a-zA-Z0-9]*"/&/g *myfiles* 但是我想在{&1}上运行s/-//如果可能的话。

3 个答案:

答案 0 :(得分:2)

你似乎正在使用GNU sed,所以这样的东西可能会起作用:

sed -ri '
  s/(Special_Section [^-]*)-([^)]*)/\1\2/g
  ' <your_filename_glob>

答案 1 :(得分:1)

关闭 - 扫描线条,然后替换匹配的线条:

sed -i '/Special_Section "[a-zA-Z0-9]*-[a-zA-Z0-9]*"/s/\( "[a-zA-Z0-9]*\)-\([a-zA-Z0-9]*\)"/\1\2/' *myfiles*

您可以将其拆分为多行以避免SO中的滚动条:

sed -i '/Special_Section "[a-zA-Z0-9]*-[a-zA-Z0-9]*"/{
        s/\( "[a-zA-Z0-9]*\)-\([a-zA-Z0-9]*\)"/\1\2/
        }' *myfiles*

进一步的想法,你也可以这样做:

sed -i 's/\(Special_Section "[a-zA-Z0-9]*\)-\([a-zA-Z0-9]*"\)/\1\2/' *myfiles*

这更紧凑。如果需要,您可以添加g限定符。两种解决方案都使用特殊的\(...\)表示法来捕获正则表达式的部分内容。

答案 2 :(得分:1)

这有用吗?

sed -i '/(Special_Section ".*-.*")/{s/-//}' yourFile