使用 awk 进行文本处理

使用 awk 进行文本处理

我有如下文字:

select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}}

我需要写入一个文件

{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}} 
{{113,evid}}

每个项目都在自己的行上。

我尝试过,awk -F '[{}]' '{print $2}'但它仅打印第一次出现的情况,并且仅打印不带{}.添加后缀和前缀{}会出现语法错误?

附加要求

  • 在查询中替换为使用and{{va1,val2}}查询表后得到的单个值。val1val2

答案1

或者使用sed

sed 's/select //;s/ from[^}]* //;s/},{/}\n{/g;s/}}{{/}}\n{{/g;s/\s*and\s*/\n/g'

例子

$ echo 'select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}' | \
   sed 's/select //;s/ from[^{]*//;s/},{/}\n{/g;s/}}{{/}}\n{{/g;s/\s*and\s*/\n/g'
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}

怎么运行的:

  • s/select //;-select从头开始​​删除
  • s/ from[^{]*//;- 删除从上到下from.*的第一个{
  • s/},{/}\n{/g;- 将所有转换},{}\n{
  • s/}}{{/}}\n{{/g;- 将所有转换}}{{}}\n{{
  • s/\s*and\s*/\n/g'- 将所有转换and\n

答案2

你可以使用grep命令,在手册页中您会发现:

grep 在每个文件中搜索模式。 FILE “-”代表标准输入。如果未给出 FILE,则递归搜索将检查工作目录,非递归搜索将读取标准输入。默认情况下,grep 打印匹配的行。

-o, --only-matching 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

-e PATTERN, --regexp=PATTERN 使用 PATTERN 作为模式。如果多次使用此选项或与 -f (--file) 选项结合使用,则搜索给定的所有模式。该选项可用于保护以“-”开头的模式。

对于你的问题:

echo 'select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}}' | grep -o -e "{\{2\}[^{]*}\{2\}"
  • {\{2\}方法{符号恰好出现两次。
  • [^{]* 表示任何时候的任何字符,除了{
  • }\{2\}方法}符号恰好出现两次。

结果将:

{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}}

答案3

这个怎么样。将字段 2 中的每个“},”替换为“}”,然后打印字段 2。

awk '{gsub(/},/,"} ",$2);print $2}' file

或者在sed.删除“select”和“from”之间的文本,并将每个“},”替换为“}”。

sed 's/^select \({.*}\) from .*/\1/;s/},/} /g' file

答案4

我会使用grep而不是awk.这里-P标志要求grep使用 PCRE 正则表达式而不是默认的(以便.*?匹配尽可能少),并且该-o标志grep只打印匹配的组件:

grep -Po '{{.*?}}'

例子:

grep -Po '{{.*?}}' <<<'select {{112,department}},{{112,client}},{{112,place}} from table where id=1 and {{112,cgid}} and {{113,evid}}'
{{112,department}}
{{112,client}}
{{112,place}}
{{112,cgid}}
{{113,evid}}

您的查询中没有{{va1,val2}}匹配的内容,因此“附加要求”没有实际意义。或者您是否泛化到匹配的实体,例如{{112,department}}?如果是这样,您需要解释要做什么,因为将查询中的[它们]替换为我将在[稍后]得到的单个值这个要求太宽泛,无法用显式代码来解决。

相关内容