2

当我给出命令awk NR==7 ABC.mod时,它给了我我需要的标题(“添加”),它位于文件的第 7 行目前我只能阅读标题,但我不知道如何将其附加到输出中。有人可以帮我组织一下,这样我就可以修改代码以获得预期的菜单输出,而对现有脚本的干扰最小(我希望)?

4

1 回答 1

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

我希望我对您问题的回答可以帮助您了解有关如何修改应用程序的更多信息。

于 2013-06-25T17:52:16.750 回答