当我发出命令awk NR==7 ABC.mod
时,它给了我需要的标题('添加'),该标题出现在文件的第7行当前我只能阅读标题,但我不知道如何将其附加到输出。有人可以帮我组织这个,所以我可以修改代码以获得预期的菜单输出,同时对现有脚本的干扰最小(我希望)吗?
答案 0 :(得分:1)
假设您可以从每个*.mod
文件的第7行中提取“添加”,“删除”...和其他“标题”,那么您需要修改脚本查看文件的位置在{em>似乎创建菜单的行之前的某个地方a1.out
,即:tr ' ' '\n' < ~/a1.out > ~/b.dat
。
我说“假设”因为,即使您提到awk NR==7
,我也看不到您在脚本中使用它的位置。在任何情况下,如果你可以从给定*.mod
文件的第7行获得“标题”,那么你可以从文件名中获取菜单“name”(这似乎是你构建你的方式)菜单)像这样:
awk '{ln=length(ARGV[1]); if(NR==7) print substr(ARGV[1],0,ln-4)"..."$0}' ABC.mod
输出:
ABC...Add
使用sed
可能有一种更简单,更简单的方法,但您提到了awk
。
至少对我而言,还没有足够的信息继续帮助你。如果你更新你的问题,有人可能会提出更具体的建议。
修改强>
我会在这里发布我的作品,希望你发现它很有用。这不是一个完整的解决方案。我不得不说,这是一个奇怪的编写应用程序 - shell代码和变量硬连线到临时数据到遍布文件系统的位置。尝试设置本地版本试用它有点毛茸茸。希望通过对鳕鱼进行实验和修改,您将了解有关应用程序如何工作以及一般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
我希望我对您的问题的回复可以帮助您了解有关如何修改应用程序的更多信息。