当我给出命令awk NR==7 ABC.mod
时,它给了我我需要的标题(“添加”),它位于文件的第 7 行目前我只能阅读标题,但我不知道如何将其附加到输出中。有人可以帮我组织一下,这样我就可以修改代码以获得预期的菜单输出,而对现有脚本的干扰最小(我希望)?
1 回答
假设您可以从每个文件的第 7 行中提取“添加”、“删除”...和其他“标题” *.mod
,那么您需要修改脚本,使其在似乎创建a1.out
的行之前的某处查看文件菜单,即:。tr ' ' '\n' < ~/a1.out > ~/b.dat
我说“假设”是因为,即使您提到awk NR==7
,我也看不到您在脚本中使用它的位置。无论如何,如果您可以从给定*.mod
文件的第 7 行获取“标题”,那么您可以从文件名中获取菜单“名称”(这似乎是您构建菜单的方式),如下所示:
awk '{ln=length(ARGV[1]); if(NR==7) print substr(ARGV[1],0,ln-4)"..."$0}' ABC.mod
输出:
ABC...Add
使用 可能有一种更短、更简单的方法sed
,但您提到了awk
.
至少对我来说,没有足够的信息可以进一步帮助你。如果您更新您的问题,有人可能会提供更具体的建议。
编辑:
我会在这里发布我的工作,希望你觉得它有用。这不是一个完整的解决方案。我不得不说,这是一个写得很奇怪的应用程序——外壳代码和变量硬连线到临时数据到散布在文件系统周围的位置。尝试设置本地版本进行尝试有点麻烦。希望通过试验和修改代码,您将更多地了解您的应用程序是如何工作的以及一般的 shell 编程。额外建议:记录您的更改;勾勒出您的应用程序如何/在何处读取和写入其数据;在源代码中使用注释来帮助您和其他人记住代码是如何工作的;进行备份;使用源代码控制。
我的假设:
pradee.sh
看起来像这样(为什么文件有.sh
扩展名 - 看起来更像是它为您的脚本定义了一些常量)
% cat pradee.sh
HBKTM
ABC
HBKTM
CBC
HBKTM
DBC
HBKTM
IBC
HBKTM
MBCE
HBKTM
UBC
HBKTM
VBCM
以下是我创建“测试环境”的方式:
% for file in `grep -v HBKTM pradee.sh`; do touch $file.mod ; done
% ls
ABC.mod CBC.mod DBC.mod IBC.mod MBCE.mod UBC.mod VBCM.mod pradee.sh
% echo -e "_ctrl.jsp \n\n\n\n\n" > *.mod # mod files have required text+6 lines
% echo -e "_ctrl.jsp \n\n\n\n\n" > HBKTM.mod # this file seems special ?
% sed -i'' -e "7i\\[Ctrl-V Ctrl-J]
Add" ABC.mod
OR since the files now have 6 lines ... echo the menu title onto the last line:
% echo "Delete" >> DBC.mod
% echo "Insert" >> IBC.mod
... [continue inserting titles like "Add" "Delete" etc to the other *.mod files]
在那之后,我想我有模仿你的设置的数据文件。你告诉我。现在,如果我对您的脚本进行一些小的更改(因此文件位置不会删除覆盖我自己的文件)并添加awk
我之前提到的命令,这就是我最终的结果:
# menu_create.sh
# See http://stackoverflow.com/questions/17297671
rm -f *.dat
clear
cont="y"
while [ "$cont" = "y" ] # "$" is need for POSIX
do
echo -e "\n\nPlease Enter ONS Name : "
read ons
currpath=.
up=$(echo $ons|tr '[:lower:]' '[:upper:]')
#echo "\n ONS menu name \n"
#echo $up
if [ -f $up.mod ]; then
#in=$(grep -ri $up pradee.sh) # changed to following
# - how could this have worked ?
in=$(grep -v $up pradee.sh)
if [ -n "$in" ]; then
onsname=$(grep -ri "_ctrl.jsp" $up.mod)
#echo "onsname : $onsname"
if [ -n "$onsname" ]; then
echo -e "\n ONS menu name : $up "
echo $in > a1.dat
#echo "written to a1.dat\n"
#cat ~/a1.dat
#tr ' ' '\n' < ~/a1.dat > ~/a.dat
#cat ~/a.dat
sed "s/$up//g" a1.dat >a1.out
for i in `cat a1.dat`;
do
awk '{ln=length(ARGV[1]);if(NR==7) print substr(ARGV[1],0,ln-4)"..."$0}' $i.mod >> menu.dat ;
done
echo -e "\n FINUX Names \n"
#tr ' ' '\n' < a1.out > b.dat
tr ' ' '\n' < menu.dat > b.dat
cat b.dat
else
echo -e "ONS Name Not Valid !"
fi
else
echo -e "FINUX menu Name not found in our Repository"
fi
else
echo -e "\n Please Enter valid ONS name !!"
fi
echo -e "\n\n Press "y" to continue, Any other key to exit"
read cont
done
它给了我这个输出:
Please Enter ONS Name :
hbktm
ONS menu name : HBKTM
FINUX Names
ABC...Add
CBC...Cancel
DBC...Delete
IBC...Insert
MBCE...Modify
UBC...Undelete
VBCM...Verify
Press y to continue, Any other key to exit
q
我希望我对您问题的回答可以帮助您了解有关如何修改应用程序的更多信息。