如何 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
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
感谢@Dudi Boy 这个命令gawk '/if \[ "$DISPLAY" != "" \]/,/fi/{print }'
显示指定部分的行。
36
37
38
39
现在我将 \n
替换为 ,
:tr '\n' ','
36,37,38,39,
我把最后一个逗号(,)删掉:sed 's/,$//g'
36,37,38,39
并且只获取第一个和最后一个数字,用逗号 (,) 分隔:sed -E 's/,(.+),/,/g'
36,39
最后的结果我在命令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
美好的日子。我有个问题。我得到了指定内容的行。命令 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
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
感谢@Dudi Boy 这个命令
gawk '/if \[ "$DISPLAY" != "" \]/,/fi/{print }'
显示指定部分的行。36 37 38 39
现在我将
\n
替换为,
:tr '\n' ','
36,37,38,39,
我把最后一个逗号(,)删掉:
sed 's/,$//g'
36,37,38,39
并且只获取第一个和最后一个数字,用逗号 (,) 分隔:
sed -E 's/,(.+),/,/g'
36,39
最后的结果我在命令
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