如何 select 根据您在 GNU/Linux 中的文件内容对行进行分组?

How to select a group lines by your content of a file in GNU/Linux?

美好的日子。我有个问题。我得到了指定内容的行。命令 grep 允许搜索文件指定的内容,但是是逐行搜索。我想select一个内容各行。 这该怎么做? 像

cat -n /etc/profile | grep "
   if [ "$DISPLAY" != "" ]
   then
       xhost +si:localuser:root
   fi
"

非常感谢。

建议研究 grep 选项 -z


但更好的选择是 awk

使用 awk 可以 select 范围 awk '/RegExp1/,/RegExp2/' input.txt

你的情况:

 awk '/if/,/fi/{print}' input.txt

将打印 if fi 范围内的所有行。


此外,使用 awk 可以使用 RS 变量定义记录分隔符。例如记录分隔符是空行。 awk '1' RS="\n\n"

最后,我解决了,所以...

sed -i "$(cat -n /etc/profile | gawk '/if \[ "$DISPLAY" != "" \]/,/fi/{print }' | tr '\n' ',' | sed 's/,$//g' | sed -E 's/,(.+),/,/g')d" /etc/profile
  1. cat -n /etc/profile显示文件内容和行号

       27    if [ -d /etc/profile.d ]; then
       28      for i in /etc/profile.d/*.sh; do
       29        if [ -r $i ]; then
       30          . $i
       31        fi
       32      done
       33      unset i
       34    fi
       35    #start
       36    if [ "$DISPLAY" != "" ]
       37    then
       38        xhost +si:localuser:root
       39    fi
       40    #end
    
  2. 感谢@Dudi Boy 这个命令gawk '/if \[ "$DISPLAY" != "" \]/,/fi/{print }'显示指定部分的行。

       36
       37
       38
       39
    
  3. 现在我将 \n 替换为 ,tr '\n' ','

       36,37,38,39,
    
  4. 我把最后一个逗号(,)删掉:sed 's/,$//g'

       36,37,38,39
    
  5. 并且只获取第一个和最后一个数字,用逗号 (,) 分隔:sed -E 's/,(.+),/,/g'

       36,39
    
  6. 最后的结果我在命令sed中执行它:sed -i "$(cat -n /etc/profile | gawk '/if \[ "$DISPLAY" != "" \]/,/fi/{print }' | tr '\n' ',' | sed 's/,$//g' | sed -E 's/,(.+),/,/g')d" /etc/profile

结果是

if [ -d /etc/profile.d ]; then
    for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
            . $i
        fi
    done
    unset i
fi
#start
#end

非常感谢

可以用一个qawk命令完成removing/substruct远程部分的任务:

 gawk -i inplace '/if \[ "$DISPLAY" != "" \]/,/fi/{next}1' /etc/profile