使用sed匹配anyString和[之间]中的任何字符和回车符

时间:2014-08-17 16:04:11

标签: regex sed

答案:(略有修改......)感谢0xdeadbeef

sed -e "s/\t//g" -e "s/(?m)^\s*//g" -e "s/\]\(.\)/]\r\1/g;s/ *\[/[/g;s/\(.\)\[/\1\r[/g" %%~na.txt > %%~na.out

我想我需要深入研究以前的问题。

我正在使用sed -e

这是迄今为止所做的事情

sed -e "s/[^[]*/$1/g"

它会将所有匹配的anyString[替换为$1[

我想使用一个regexp变量,它将anyString的值保存为$1(我使用$1,因为这是powershell保存变量的方式)并将其重新注入$1NEWLINE[ < / p>

换行符是换行符。

老问:

我对某些人一直在帮助我的数据有非常具体的要求。

我使用正则表达式在PowerShell中运行了一个脚本,然后有人重写了它,但它仍然没有完全符合我的需要。

powershell regexp替换* [('任何字符''左括号']并替换为*`n [('任何字符''新行''左括号')

其他人建议我将它移植到linux命令行工具。所以我选择了sed vs powershell。

我们有一个工作的sed脚本

sed -e "s/^[^[]*//" -e "s/][^\[]*$/]/" -e "s/][^[]*\[/]\n\[/g"

但......它有清除非[令牌]数据的不良行为。

以下是示例输入文件:

item_gloves

[OBJECT:ITEM]

###test###
    [ITEM_GLOVES:ITEM_GLOVES_GAUNTLETS]###test###[NAME:gauntlet:gauntlets]
###test###[ARMORLEVEL:2]
[UPSTEP:1]
###test###[SHAPED]
[LAYER:ARMOR]###test######test###[COVERAGE:100]###TEST
[LAYER_SIZE:20]
[LAYER_PERMIT:15]
[MATERIAL_SIZE:2]
[SCALED]
[BARRED]
[METAL]
[LEATHER]
[HARD]

这是输出应该是什么样的

item_gloves

[OBJECT:ITEM]

###test###
[ITEM_GLOVES:ITEM_GLOVES_GAUNTLETS]
###test###
[NAME:gauntlet:gauntlets]
###test###
[ARMORLEVEL:2]
[UPSTEP:1]
###test###
[SHAPED]
[LAYER:ARMOR]
###test######test###
[COVERAGE:100]
###TEST
[LAYER_SIZE:20]
[LAYER_PERMIT:15]
[MATERIAL_SIZE:2]
[SCALED]
[BARRED]
[METAL]
[LEATHER]
[HARD]

我想我需要从这里借一些建议如何匹配除特定字符以外的任何非空格字符?

并使用一些任何字符匹配来匹配anyChar[]anyChar并插入新行

anyChar分别为*。

以及删除任何前面的空格

我想我需要匹配一个通配符

并在某些内容中替换它,但我遗漏了如何将通配符数据保存为替换sed -e "s/[^[]*//g"

的var

1 个答案:

答案 0 :(得分:2)

一个简单的方法是:

  • 删除]
  • 之后的所有空格
  • 如果后跟字符
  • ,请在]之后插入换行符
  • 删除[
  • 之前的所有空格
  • 如果[前面有字符,请在其前面插入换行符

因此,您可以使用以下表达式:

sed 's/\] */]/g;s/\]\(.\)/]\n\1/g;s/ *\[/[/g;s/\(.\)\[/\1\n[/g' item_gloves

根据您的样本输入,这将产生以下输出:

[OBJECT:ITEM]

###test###
[ITEM_GLOVES:ITEM_GLOVES_GAUNTLETS]
###test###
[NAME:gauntlet:gauntlets]
###test###
[ARMORLEVEL:2]
[UPSTEP:1]
###test###
[SHAPED]
[LAYER:ARMOR]
###test######test###
[COVERAGE:100]
###TEST
[LAYER_SIZE:20]
[LAYER_PERMIT:15]
[MATERIAL_SIZE:2]
[SCALED]
[BARRED]
[METAL]
[LEATHER]
[HARD]