【发布时间】:2015-11-27 19:05:11
【问题描述】:
我正在尝试为 grep 编写一个简单的包装器,以便将其输出以更易读的格式。这包括将匹配的字符串(出现在第二个冒号之后)放在新行上,并从匹配的字符串中修剪任何前导空格/制表符。
所以不要做以下事情:
$ grep -rnIH --color=always "grape" .
./apple.config:1: Did you know that grapes are tasty?
我希望能够得到这个:
$ grep -rnIH --color=always "grape" . | other-command
./apple.config:1:
Did you know that grapes are tasty?
我尝试了许多不同的方法来尝试做到这一点,包括使用 sed、awk 本身、替换、perl 等。要记住的重要一点是,我想从 $3 中删除前导空格,但 $3 可能不会实际上包含整个匹配的字符串(例如,如果匹配的字符串包含带有“:”字符的 url)。
到目前为止,我已经达到了以下几点。
$ grep -rnIH --color=always "grape" . | \
awk -F ":" '{gsub(/^[ \t]+/, "", $3); out=""; for(i=4;i<=NF;i++){out=out$i}; print $1":"$2"\n"$3out}'
./apple.config:1:
Did you know that grapes are tasty?
gsub 旨在从第二个冒号之后出现的任何内容的开头修剪空格/制表符。然后 for 循环旨在构建一个变量,该变量由匹配字符串中可能已被字段分隔符“:”分割的任何其他内容组成。
非常感谢任何有助于正确修剪前导空格的帮助。
【问题讨论】:
-
other-command可能是sed 's/:[[:blank:]]*/\n/2'-- 可能需要 GNU sed 作为“2”标志 -
@glennjackman - 关闭!使用
2作为标志至少在 FreeBSD 的 sed 中有效。 GNUism 将在替换字符串中使用\n。制作这个sed $'s/:[[:blank:]]*/\\\n/2',它实际上可能是可移植的!