我如何获得"awk"修改文件的某些行,而不是整个文件? [英] How do I get "awk" to modify only certain lines of a file, instead of the whole file?

查看:47
本文介绍了我如何获得"awk"修改文件的某些行,而不是整个文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想重用

I would like to reuse this awk code, to properly capitalice some cue sheet audio files. This code not only capitalice all the words, but follows some capitalization rules, as explained in the linked question.

问题在于如何修改此代码以仅大写"而不是整个文件.例如,使用以下简单的提示表:

The problem is how to modify this code to capitalize only the "TITLE" lines, and not the whole file. For example, with this simple cue sheet:

FILE "Two The Beatles Songs.wav" WAVE
  TRACK 01 AUDIO
    TITLE "dig A pony"
    PERFORMER "The Beatles"
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    TITLE "from me to you"
    PERFORMER "The Beatles"
    INDEX 01 03:58:02

并带有一个简单的for循环和awk代码,例如:

And with a simple for loop plus the awk code, for example something like this:

#!/bin/sh
for cue_file in *.cue
do
  awk 'BEGIN{split("a the to at in on with and but or",w); for(i in w)nocap[w[i]]}function cap(word){return toupper(substr(word,1,1)) tolower(substr(word,2))}{for(i=1;i<=NF;++i){printf "%s%s",(i==1||i==NF||!(tolower($i) in nocap)?cap($i):tolower($i)),(i==NF?"\n":" ")}}' "$cue_file" > ~/temp_cue_file && mv ~/temp_cue_file "$cue_file"
done

运行脚本后的结果必须是:

The result after running the script must be:

FILE "Two The Beatles Songs.wav" WAVE
  TRACK 01 AUDIO
    TITLE "Dig a Pony"
    PERFORMER "The Beatles"
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    TITLE "From Me to You"
    PERFORMER "The Beatles"
    INDEX 01 03:58:02

也就是说,用 TITLE挖小马" 代替 TITLE挖小马" .和 TITLE从我到你" 而不是 TITLE从我到你" .

That is, TITLE "Dig a Pony" instead of TITLE "dig A pony". And TITLE "From Me to You" instead of TITLE "from me to you".

请求是:

  1. 如前所述,shell脚本必须仅更改TITLE行</strong>(全部更改),而其余部分不更改.</li><li> shell脚本必须在POSIX sh shell下运行.就我而言,是FreeBSD.</li><li>一行awk代码将不胜感激.</li><li> <p>要遵循相同的大写规则" <a href ="https://stackoverflow.com/questions/35006611/how-to-convert-text-following-title-case-rules-in-bash/35012145>链接的问题</a>(并紧随提供的awk).那就是:<em class="showen"></em></ol> <ol class="en"> <li>As explained before, the shell script must change <strong>only the TITLE lines</strong> (all of them), and not the rest.</li> <li>The shell script must run under a POSIX sh shell. In my case, FreeBSD.</li> <li>An one line awk code would be appreciated.</li> <li><p>To follow the same "capitalize rules" as the linked question (and that the provided awk follows). That is:</ol> <ul class="cn"><li>除以下以外的所有单词均大写:</li><li>将所有文章(a,the),介词(到,在,在,在,与)和协调连词(和,但是,或)小写</li><li>将标题中的第一个和最后一个单词大写,而不考虑词性的不同</li></ul> <p class="cn">如何修改awk代码以获得此结果?<em class="showen"></em></p> <p class="en">How can the awk code be adapted to obtain this result? </p> <p class="cn">谢谢.</p> <p class="cn">上一行的awk代码在链接的答案中显示为展开:<em class="showen"></em></p> <p class="en">The previous one line awk code, appears expanded in the linked answer:</p> <pre><code><code>BEGIN { split("a the to at in on with and but or", w) for (i in w) nocap[w[i]] } function cap(word) { return toupper(substr(word,1,1)) tolower(substr(word,2)) } { for (i=1; i<=NF; ++i) { printf "%s%s", (i==1||i==NF||!(tolower($i) in nocap)?cap($i):tolower($i)), (i==NF?"\n":" ") } } </code></code></pre> <p class="cn"></p> <h3 class="best_ans mt-1">推荐答案</h3> <p class="cn">能否请您尝试以下操作.<em class="showen"></em></p> <p class="en">Could you please try following.</p> <pre><code><code>awk ' BEGIN{ num=split("a the to at in on with and but or",array," ") for(i=1;i<=num;i++){ smallLetters[array[i]] } } /TITLE/{ for(i=2;i<=NF;i++){ if(tolower($i) in smallLetters){ $i=tolower(substr($i,1,1)) substr($i,2) } else{ if($i~/^\"/){ $i=substr($i,1,1) toupper(substr($i,2,1)) substr($i,3) } else{ $i=toupper(substr($i,1,1)) substr($i,2) } } } } 1 ' Input_file </code></code></pre> <p class="cn"> <strong> <em>说明:</em> </strong>:添加了上述代码的详细说明.<em class="showen"></em></p> <p class="en"><strong><em>Explanation:</em></strong> Adding detailed explanation for above code.</p> <pre><code><code>awk ' ##Starting awk program from here. BEGIN{ ##Starting BEGIN section of this program from here. num=split("a the to at in on with and but or",array," ") ##Creating array for all words needs to be of lower size. for(i=1;i<=num;i++){ ##Running a for loop from i=1 to tillvalue of num(length of array). smallLetters[array[i]] ##Creating an array named smallLetters with index of variable i here. } } /TITLE/{ ##Checking condition if a line contains string TITLE then do following. for(i=2;i<=NF;i++){ ##Running a for loop from 2nd field to last field of line. if(tolower($i) in smallLetters){ ##Checking condition if lower case current field is present in array smallLetters. $i=tolower(substr($i,1,1)) substr($i,2) ##Changing current field to lower case for 1st letter and keeping rest same as it is. } else{ ##If current field is NOT in array then do following. if($i~/^\"/){ ##Checking if field starts from " then do following. $i=substr($i,1,1) toupper(substr($i,2,1)) substr($i,3) ##Only make 2nd letter Capital since 1st is " } else{ $i=toupper(substr($i,1,1)) substr($i,2) ##Else make1st character capital and keep as it is. } } } } 1 ##Printing edited/non-edited lines here. ' Input_file ##Mentioning Input_file name here. </code></code></pre> <p>这篇关于我如何获得"awk"修改文件的某些行,而不是整个文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!</p> </div> <div class="arc-body-main-more"> <span onclick="unlockarc('2258577');">查看全文</span> </div> </div> <div> </div> <div class="wwads-cn wwads-horizontal" data-id="166" style="max-width:100%;border: 4px solid #666;"></div> </div> </article> <div id="arc-ad-2" class="mb-1"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5038752844014834" crossorigin="anonymous"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5038752844014834" data-ad-slot="3921941283"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="widget bgwhite radius-1 mb-1 shadow widget-rel"> <h5>相关文章</h5> <ul> <li> <a target="_blank" title="C-如何从文件中读取某些行? (不是所有行或整个文件,而是某些行)" href="/2079124.html"> C-如何从文件中读取某些行? (不是所有行或整个文件,而是某些行); </a> </li> <li> <a target="_blank" title="如何获取文件名而不是文件的整个文件路径?" href="/694566.html"> 如何获取文件名而不是文件的整个文件路径?; </a> </li> <li> <a target="_blank" title="显示整个文件的Git diff命令被修改,而不是显示修改的小部分代码" href="/800947.html"> 显示整个文件的Git diff命令被修改,而不是显示修改的小部分代码; </a> </li> <li> <a target="_blank" title="忽略git中文件的特定更改,而不是整个文件" href="/800717.html"> 忽略git中文件的特定更改,而不是整个文件; </a> </li> <li> <a target="_blank" title="Excel VBA-如何逐行读取csv文件,而不是整个文件" href="/2225106.html"> Excel VBA-如何逐行读取csv文件,而不是整个文件; </a> </li> <li> <a target="_blank" title="UITableview:如何禁用某些行而不是其他行的选择" href="/915041.html"> UITableview:如何禁用某些行而不是其他行的选择; </a> </li> <li> <a target="_blank" title="在不同线路grep的文件多串(即整个文件,而不是基于行搜索)?" href="/313664.html"> 在不同线路grep的文件多串(即整个文件,而不是基于行搜索)?; </a> </li> <li> <a target="_blank" title="本地忽略文件修改,而不是远程忽略" href="/2100064.html"> 本地忽略文件修改,而不是远程忽略; </a> </li> <li> <a target="_blank" title="是否可以扩展单个宏而不是整个文件?" href="/2390350.html"> 是否可以扩展单个宏而不是整个文件?; </a> </li> <li> <a target="_blank" title="Git只添加所有新文件,而不是修改文件" href="/796884.html"> Git只添加所有新文件,而不是修改文件; </a> </li> <li> <a target="_blank" title="用fread计算行而不读取整个文件" href="/2029710.html"> 用fread计算行而不读取整个文件; </a> </li> <li> <a target="_blank" title="如何从目录而不是整个路径获取文件名" href="/1901834.html"> 如何从目录而不是整个路径获取文件名; </a> </li> <li> <a target="_blank" title="复制整个行(值而不是公式)VBA" href="/2246089.html"> 复制整个行(值而不是公式)VBA; </a> </li> <li> <a target="_blank" title="Repository 方法只能返回整个实体而不是某些属性" href="/2406783.html"> Repository 方法只能返回整个实体而不是某些属性; </a> </li> <li> <a target="_blank" title="如何提交只修改(而不是新的或删除)的文件?" href="/798222.html"> 如何提交只修改(而不是新的或删除)的文件?; </a> </li> <li> <a target="_blank" title="有没有办法告诉git只包含某些文件而不是忽略某些文件?" href="/797123.html"> 有没有办法告诉git只包含某些文件而不是忽略某些文件?; </a> </li> <li> <a target="_blank" title="如何清除批量而不是整个屏幕中的选定行?" href="/1966078.html"> 如何清除批量而不是整个屏幕中的选定行?; </a> </li> <li> <a target="_blank" title="如何仅在某些项目而不是整个集合上安装TFS扩展" href="/2196295.html"> 如何仅在某些项目而不是整个集合上安装TFS扩展; </a> </li> <li> <a target="_blank" title="从ini文件的某些部分读取某些密钥(sed/awk?)" href="/1956848.html"> 从ini文件的某些部分读取某些密钥(sed/awk?); </a> </li> <li> <a target="_blank" title="如何使用Watson Discovery获得确切的答案而不是整个文档?" href="/1852840.html"> 如何使用Watson Discovery获得确切的答案而不是整个文档?; </a> </li> <li> <a target="_blank" title="git撤销自动合并特定的文件,而不是整个分支" href="/801624.html"> git撤销自动合并特定的文件,而不是整个分支; </a> </li> <li> <a target="_blank" title="prePEND文件的某些行" href="/313638.html"> prePEND文件的某些行; </a> </li> <li> <a target="_blank" title="我可以使用WatchService(而不是整个目录)查看单个文件更改吗?" href="/956773.html"> 我可以使用WatchService(而不是整个目录)查看单个文件更改吗?; </a> </li> <li> <a target="_blank" title="使用Webclient和DownloadFile()获得.txt文件而不是.jpg文件;" href="/2152741.html"> 使用Webclient和DownloadFile()获得.txt文件而不是.jpg文件;; </a> </li> <li> <a target="_blank" title="Python压缩子文件夹而不是整个文件夹路径" href="/2421721.html"> Python压缩子文件夹而不是整个文件夹路径; </a> </li> </ul> </div> <div class="mb-1"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5038752844014834" crossorigin="anonymous"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5038752844014834" data-ad-slot="3921941283"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="side"> <div class="widget widget-side bgwhite mb-1 shadow"> <h5>其他开发最新文章</h5> <ul> <li> <a target="_blank" title="拒绝显示一个框架,因为它将'X-Frame-Options'设置为'sameorigin'" href="/893060.html"> 拒绝显示一个框架,因为它将'X-Frame-Options'设置为'sameorigin'; </a> </li> <li> <a target="_blank" title="什么是&QUOT; AW&QUOT;在部分标志属性是什么意思?" href="/303988.html"> 什么是&QUOT; AW&QUOT;在部分标志属性是什么意思?; </a> </li> <li> <a target="_blank" title="在运行npm install命令时获取'npm WARN弃用'警告" href="/840917.html"> 在运行npm install命令时获取'npm WARN弃用'警告; </a> </li> <li> <a target="_blank" title="cmake无法找到openssl" href="/516280.html"> cmake无法找到openssl; </a> </li> <li> <a target="_blank" title="从Spark的scala中的* .tar.gz压缩文件中读取HDF5文件" href="/850628.html"> 从Spark的scala中的* .tar.gz压缩文件中读取HDF5文件; </a> </li> <li> <a target="_blank" title="Twitter :: Error :: Forbidden - 无法验证您的凭据" href="/630061.html"> Twitter :: Error :: Forbidden - 无法验证您的凭据; </a> </li> <li> <a target="_blank" title="我什么时候需要一个fb:app_id或者fb:admins?" href="/747981.html"> 我什么时候需要一个fb:app_id或者fb:admins?; </a> </li> <li> <a target="_blank" title="将.db文件导入R" href="/902960.html"> 将.db文件导入R; </a> </li> <li> <a target="_blank" title="npm通知创建一个lockfile作为package-lock.json。你应该提交这个文件" href="/744854.html"> npm通知创建一个lockfile作为package-lock.json。你应该提交这个文件; </a> </li> <li> <a target="_blank" title="拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src'self'”" href="/819167.html"> 拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src'self'”; </a> </li> </ul> </div> <div class="widget widget-side bgwhite mb-1 shadow"> <h5> 热门教程 </h5> <ul> <li> <a target="_blank" title="Java教程" href="/OnLineTutorial/java/index.html"> Java教程 </a> </li> <li> <a target="_blank" title="Apache ANT 教程" href="/OnLineTutorial/ant/index.html"> Apache ANT 教程 </a> </li> <li> <a target="_blank" title="Kali Linux教程" href="/OnLineTutorial/kali_linux/index.html"> Kali Linux教程 </a> </li> <li> <a target="_blank" title="JavaScript教程" href="/OnLineTutorial/javascript/index.html"> JavaScript教程 </a> </li> <li> <a target="_blank" title="JavaFx教程" href="/OnLineTutorial/javafx/index.html"> JavaFx教程 </a> </li> <li> <a target="_blank" title="MFC 教程" href="/OnLineTutorial/mfc/index.html"> MFC 教程 </a> </li> <li> <a target="_blank" title="Apache HTTP客户端教程" href="/OnLineTutorial/apache_httpclient/index.html"> Apache HTTP客户端教程 </a> </li> <li> <a target="_blank" title="Microsoft Visio 教程" href="/OnLineTutorial/microsoft_visio/index.html"> Microsoft Visio 教程 </a> </li> </ul> </div> <div class="widget widget-side bgwhite mb-1 shadow"> <h5> 热门工具 </h5> <ul> <li> <a target="_blank" title="Java 在线工具" href="/Onlinetools/details/4"> Java 在线工具 </a> </li> <li> <a target="_blank" title="C(GCC) 在线工具" href="/Onlinetools/details/6"> C(GCC) 在线工具 </a> </li> <li> <a target="_blank" title="PHP 在线工具" href="/Onlinetools/details/8"> PHP 在线工具 </a> </li> <li> <a target="_blank" title="C# 在线工具" href="/Onlinetools/details/1"> C# 在线工具 </a> </li> <li> <a target="_blank" title="Python 在线工具" href="/Onlinetools/details/5"> Python 在线工具 </a> </li> <li> <a target="_blank" title="MySQL 在线工具" href="/Onlinetools/Dbdetails/33"> MySQL 在线工具 </a> </li> <li> <a target="_blank" title="VB.NET 在线工具" href="/Onlinetools/details/2"> VB.NET 在线工具 </a> </li> <li> <a target="_blank" title="Lua 在线工具" href="/Onlinetools/details/14"> Lua 在线工具 </a> </li> <li> <a target="_blank" title="Oracle 在线工具" href="/Onlinetools/Dbdetails/35"> Oracle 在线工具 </a> </li> <li> <a target="_blank" title="C++(GCC) 在线工具" href="/Onlinetools/details/7"> C++(GCC) 在线工具 </a> </li> <li> <a target="_blank" title="Go 在线工具" href="/Onlinetools/details/20"> Go 在线工具 </a> </li> <li> <a target="_blank" title="Fortran 在线工具" href="/Onlinetools/details/45"> Fortran 在线工具 </a> </li> </ul> </div> </div> </div> <script type="text/javascript">var eskeys = '我,如何,获得,awk,修改,文件,的,某些,行,而,不是,整个,文件'; var cat = 'cc';';//other-dev</script> </div> <div id="pop" onclick="pophide();"> <div id="pop_body" onclick="event.stopPropagation();"> <h6 class="flex flex101"> 登录 <span onclick="pophide();">关闭</span> </h6> <div class="pd-1"> <div class="wxtip center"> <span>扫码关注<em>1秒</em>登录</span> </div> <div class="center"> <img id="qr" src="https://huajiakeji.com/Content/Images/qrydx.jpg" alt="" style="width:150px;height:150px;" /> </div> <div style="margin-top:10px;display:flex;justify-content: center;"> <input type="text" placeholder="输入验证码" id="txtcode" autocomplete="off" /> <input id="btngo" type="button" onclick="chk()" value="GO" /> </div> <div class="center" style="margin: 4px; font-size: .8rem; color: #f60;"> 发送“验证码”获取 <em style="padding: 0 .5rem;">|</em> <span style="color: #01a05c;">15天全站免登陆</span> </div> <div id="chkinfo" class="tip"></div> </div> </div> </div> <script type="text/javascript" src="https://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script> <script type="text/javascript" src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.min.js"></script> <script type="text/javascript" src="https://img01.yuandaxia.cn/Scripts/highlight.min.js"></script> <script type="text/javascript" src="https://img01.yuandaxia.cn/Scripts/base.js?v=0.22"></script> <script type="text/javascript" src="https://img01.yuandaxia.cn/Scripts/tui.js?v=0.11"></script> <footer class="footer"> <div class="container"> <div class="flink mb-1"> 友情链接: <a href="https://www.it1352.com/" target="_blank">IT屋</a> <a href="https://huajiakeji.com/" target="_blank">Chrome插件</a> <a href="https://www.cnplugins.com/" target="_blank">谷歌浏览器插件</a> </div> <section class="copyright-section"> <a href="https://www.it1352.com" title="IT屋-程序员软件开发技术分享社区">IT屋</a> ©2016-2022 <a href="http://www.beian.miit.gov.cn/" target="_blank">琼ICP备2021000895号-1</a> <a href="/sitemap.html" target="_blank" title="站点地图">站点地图</a> <a href="/Home/Tags" target="_blank" title="站点标签">站点标签</a> <a target="_blank" alt="sitemap" href="/sitemap.xml">SiteMap</a> <a href="/1155981.html" title="IT屋-免责申明"><免责申明></a> 本站内容来源互联网,如果侵犯您的权益请联系我们删除. </section> <!--统计代码--> <script type="text/javascript"> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?0c3a090f7b3c4ad458ac1296cb5cc779"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script type="text/javascript"> (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </div> </footer> </body> </html>