![当“/”是名称的一部分时,awk 在行之间打印](https://linux22.com/image/226809/%E5%BD%93%E2%80%9C%2F%E2%80%9D%E6%98%AF%E5%90%8D%E7%A7%B0%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86%E6%97%B6%EF%BC%8Cawk%20%E5%9C%A8%E8%A1%8C%E4%B9%8B%E9%97%B4%E6%89%93%E5%8D%B0.png)
我需要打印名称中包含“/”的行之间的行。我尝试过:
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/