gpt4 book ai didi

bash - 跳过 sed 中的模式

转载 作者:行者123 更新时间:2023-12-04 18:39:39 24 4
gpt4 key购买 nike

我写了一个正常工作的sed用标记之间的单个空格替换多个空格的脚本(它跳过带有 #// 的行):

#!/bin/sed -f
/.*#/ !{
/\/\//n
# handle more than one space between tokens
s/\([^ ]\)\s\+/\1 /g
}

我像这样在 ubuntu 上运行它: ./spaces.sed < spa.txt
温泉.txt:
/**      spa.txt      text
date : some date
hih+jjhh jgjg
if ( hjh>=hjhjh )
y **/
# this is a comment
// this is a comment
lines begins here ;
/****** this line is comment ****/
some more lines
// again comment
more lines words
/** again multi line co
mmment it
comment line
follows till here**/
file ends

现在我想添加脚本应该跳过模式之间的行的功能(模式可以分布在多行中)。这是模式: /**/
我尝试了很多东西但没有用:
#!/bin/sed -f
/.*#/ !{
/\/\*/,/\*\// {
/\/\*/n #it skips successfully the /* line
n #also skips next line
/\*\// !{
}
}
/\/\//n
# handle more than one space between tokens
s/\([^ ]\)\s\+/\1 /g
}

但脚本没有按预期工作。

预期输出:
/**      spa.txt      text
date : some date
hih+jjhh jgjg
if ( hjh>=hjhjh )
y **/
# this is a comment
// this is a comment
lines begins here ;
/****** this line is comment ****/
some more lines
// again comment
more lines words
/** again multi line co
mmment it
comment line
follows till here**/
file ends

建议?
谢谢

最佳答案

我会重新设计脚本,以处理 #//自己发表评论。与 /* … */注释,您必须分别处理单行和多行变体。我也会使用 [[:space:]]符号来发现空格或制表符。我更喜欢避免使用反斜杠(在我年轻的时候使用 troff 引起的厌恶——如果你从来不需要连续 16 个反斜杠来获得想要的效果,那么你就没有受够了),所以我使用\%…%选择%字符作为搜索标记,而不是 / (这意味着不需要用反斜杠转义模式中的斜杠),我使用 [*]而不是 \* . { p; d; } notation 打印当前行,然后将其删除并移至下一行。 (使用 n 将下一行附加到当前行;这不是您需要的。)。 GNU sed 不需要第二个分号但由 BSD (macOS) sed .这些大括号中的空格是可选的,但更易于阅读。

把这些放在一起,你可能有 spaces.sed像这样:

#!/bin/sed -f

# Comments with a #
/#/ { p; d; }
# Comments with //
\%//% { p; d; }

# Single line /* ... */ comments
\%/[*].*[*]/% { p; d; }
# Multi-line /* ... */ comments
\%/[*]%,\%[*]/% { p; d; }

s/\([^[:space:]]\)[[:space:]]\{2,\}/\1 /g

在您的示例数据上(感谢您包含它!),这会产生:
/**      spa.txt      text
date : some date
hih+jjhh jgjg
if ( hjh>=hjhjh )
y **/
# this is a comment
// this is a comment
lines begins here ;
/****** this line is comment ****/
some more lines
// again comment
more lines words
/** again multi line co
mmment it
comment line
follows till here**/
file ends

这看起来像你想要的。

限制
  • 它不会删除行首的多个空格。
            the leading blanks are not removed.
  • 如果您有一行包含多个空格和 //# ,多个空格仍然存在:
    these     spaces    // survive
    so do # these
  • 如果您在一行上有多个单行注释,则不会删除它们之间的空格:
    /* these */  spaces  are   not   /* removed */
  • 如果您有一个单行注释并且多行注释在单行上开始,则不会发现多行注释。同样,如果您有一个以一行结束的多行注释,并且在它之后有一个单行注释,那么如果在一个注释的结尾和下一个注释的开头之间有多个空格,则它们不是处理。
    /* this */  is  not  /* handled
    very well */ nor are these /* spaces */
  • 这不涉及开始或结束注释符号中间的反斜杠换行符的微妙之处,也不涉及 // 末尾的反斜杠换行符。评论。只有脑死亡程序(或程序员)会产生这样的评论,所以它不应该是一个真正的问题。幸运的是,您不是在编写编译器。那些必须处理的废话。并且不要让我开始使用三元组!
  • 它不处理字符串(或多字符字符常量)中的类似注释的序列:
    "/* this is not a comment */"
    '/*', ' ', '*/'

  • 但是,这些问题中的大多数都很微妙,以至于您可能无需处理它们就可以了。如果你必须处理它们,那么你需要一个程序,而不是 sed脚本(假设你重视你的理智)。

    关于bash - 跳过 sed 中的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60648384/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com