当“/”是名称的一部分时,awk 在行之间打印

当“/”是名称的一部分时,awk 在行之间打印

我需要打印名称中包含“/”的行之间的行。我尝试过:

awk '/+SOLUTION/ESTIMATES/,/-SOLUTION/ESTIMATES/' $F > fil$F

awk '/+SOLUTION"/"ESTIMATES/,/-SOLUTION"/"ESTIMATES/' $F > fil$F

awk '/"{+SOLUTION/ESTIMATES}"/,/"{-SOLUTION/ESTIMATES}"/' $F > fil$F

但错误总是或多或少与“未终止的字符串”相同。

如何打印这些图案之间的线条?

答案1

/regex/是 的缩写$0 ~ /regex/,你也可以写成$0 ~ "regex",所以除了/通过添加前缀来转义\或者\octal与字符值一起使用/(例如\57在基于 ASCII 的系统上,在基于 EBCDIC 的系统上)\141,你还可以这样做:

awk '$0 ~ "\\+SOLUTION/ESTIMATES", $0 ~ "-SOLUTION/ESTIMATES"' < "$F" > "fil$F"

注意+是扩展的正则表达式运算符,因此需要转义为\+[+]。由于\在 的语法中也有特殊含义"strings",因此最好将其加倍,以便\将 a 传递给正则表达式引擎。通过某些awk实现,您可以侥幸逃脱,"\+"但不是全部。

请注意,如果可能的话,使用重定向而不是传递文件路径作为参数是更好的选择,因为这样awk会阻塞$F 诸如-或 包含(或以旧版本的 busybox=开头)的值。您还忘记引用该参数,使其受到 split+glob 的影响。通常不需要在重定向目标中引用参数扩展,除了 ksh88 和 bash shell 在非 POSIX 模式时的显着例外(后者仍然广泛使用),因此在那里引用它们仍然是一个好习惯。-awk$F

在这里,您可以进行子字符串搜索,而不是正则表达式匹配:

awk 'index($0, "+SOLUTION/ESTIMATES"), index($0, "-SOLUTION/ESTIMATES")' < "$F" > "$fil$F"

从该行打印正是+SOLUTION/ESTIMATES那个准确地-SOLUTION/ESTIMATES(或者如果没有找到则到输入的末尾):

awk '$0 == "+SOLUTION/ESTIMATES", $0 == "-SOLUTION/ESTIMATES"' < "$F" > "$fil$F"

使用perl提供了更大的灵活性:

# regex, but with different delimiters (m@...@, m{...}...)
perl -ne 'print if m{\+SOLUTION/ESTIMATES} .. m{-SOLUTION/ESTIMATES}'
# regex but use \Q...\E regex quoting for anything inside to be taken literally:
perl -ne 'print if m{\Q+SOLUTION/ESTIMATES\E} .. m{-SOLUTION/ESTIMATES}'
# substring search with q(...) as strong quotes, same as '...' except
# easier to use inside shell '...' quotes.
perl -ne 'print if index($_, q(+SOLUTION/ESTIMATES)) >= 0 ..
                   index($_, q(-SOLUTION/ESTIMATES)) >= 0'
# string equality with eq
perl -lne 'print if $_ eq q(+SOLUTION/ESTIMATES) ..
                    $_ eq q(-SOLUTION/ESTIMATES)'

答案2

如何打印这些图案之间的线条?

通过替换/模式\57之间的记录(以及具有这些模式的记录)可以被打印。

但请阅读在使用范围表达式之前

$ echo 'foo/bar was here' | awk '/foo\57bar/'
foo/bar was here

答案3

当在 awk 中使用时正则表达式常量,必须对正斜杠字符进行转义以将其与周围的分隔符区分开。以 GNU awk 为例:

$ echo 'foo/bar was here' | gawk '/foo/bar/'
awk: cmd. line:2: /foo/bar/
awk: cmd. line:2:          ^ unexpected newline or end of string

$ echo 'foo/bar was here' | gawk '/foo\/bar/'
foo/bar was here

此外,该+字符在 awk 使用的扩展正则表达式 (ERE) 方言中具有特殊含义,如果您想匹配文字加字符,则应对其进行转义。所以:

/\+SOLUTION\/ESTIMATES/,/-SOLUTION\/ESTIMATES/

相关内容