0%

sed命令在macos环境下的使用

最近一直有用 sed 命令来处理文本,感觉蛮有用的记录下来。
首先要保证目标文本都是以行为单位来展示的,也就是每一行都是 sed 的目标处理行。
因为gnu-sed 和 macos 上的 sed 还是有区别的,所以注意自己的版本和查找,gnu-sed 的方法还是多于 macos sed的。If there’s any osx user interested, you can use gsed insted of sed to make it work (install it with macport or brew install gnu-sed)。

基本方法

# 1 sed 's/.*a//;s/b.*//;' 就是截取ab之间的内容
# 2 awk -F [] 按照中括号里的分割符分割字符串
# 3 tail -r 倒叙
sed 's/.*\ src//;s/alt.*//;s/style.*//;' ~/Documents/sednew.html | awk -F '[" / .]' '{print $9,$10,$14}' | tail -r
# 1 macos 系统 sed -i 后面需要跟上 ‘’ 不然会报错
# 2 sed -e 接两个 sed 命令
# 3 替换命令需要双引号才能让 date 命令有效
sed -i '' -e "s/scripts\/main.js.*/scripts\/main.js?v=$(date +%y%m%d%H%M)\"><\/script>/" -e "s/scripts\/tlConfig.js.*/scripts\/tlConfig.js?v=$(date +%y%m%d%H%M)\"><\/script>/" ./index.html
# macos下必须换行,添加的行首尾都换行
# 也就是 toc: true 首尾都要换行
# 就是在这个文件的第2行加一行文字
sed -i "" '2i\
toc: true
' Big\ Sur\ Beta\ 3\ 上传\ mac\ 应用失败的原因.md

find matching text and replace next line

sed '/<key>ConnectionString<\/key>/!b;n;c<string>changed_value</string>' file
其中 <key>ConnectionString<\/key> 是匹配的文字
<string>changed_value</string>是要替换的文字
也就是替换匹配行的下一行内容。

How can I use “sed” to delete 2 lines after match/matches?

sed -e '/match1/,+2d' input.txt
sed -i '' -e '/function-row/,+7d' xcov1017.html

删除<开头的所有行,必须顶格,每行前面不能有空格

sed -i '' 's/^[ ]*//' ~/Desktop/untitled.html 删除开头的空格
sed -i '' '/^</d' xcov1016.txt

删除匹配行和下一行之外的所有内容

sed -n '/.*Handler.*/,+2p' xcov1016.txt

样例

2020-12-21 19:39
原始数据格式,gdrive上的格式。

<c-wiz jsrenderer="zQdOjc" class="pmHCK" jsdata="deferred-c7" data-p="%.@.[1,[4,6,8,12,3,13],[6,4,12,8,3,13],2,[4,1,true,true],[[4,1,true,true],[1,2,true,true]],5,[5],2,[2,1],[null,null,null,null,true],null,[false,null,true,true,true,true,null,true,true]],[[4,1,true,true],5]]" data-node-index="1;0" autoupdate="" jsmodel="hc6Ubd aDmR9e"><div data-target="doc" draggable="true" jsaction="I6mUue:Ppnscc;Cej8pc:Krrt9b;Zhs91b:UNwd5e;dAEAFb:p4DfEc;MUmfBf:VWAsNe;u4juXc:E8sp8c;EV6U7c:crY0ee;rcuQ6b:uaW3He" jscontroller="LPQUTd" data-id="1AwrZdXeVr32w0dtdZ2NaVQ_Ysl4q-vWl" class="WYuW0e RDfNAe GZwC2b dPmH0b"><div jsaction="click:cOuCgd; contextmenu:mg9Pef; dblclick:FNFY6c; focus:AHmuwe" jsname="LvFR7c" role="row" tabindex="0" aria-selected="true" aria-disabled="false"><div role="gridcell" data-list-item-target="" class="jGNTYb" jsaction=" mousedown:TiSivd;hzT8Uc:z3EvVc;VBYlob:DaY83b;RIljlb:GdobJc" aria-label="1. Java生产环境下性能监控与调优详解 Google 드라이브 폴더"><div class="bSmy5"><div class="a-Oa-qd-Nd"><svg height="100%" width="100%" viewBox="0 0 10 10" preserveAspectRatio="none" focusable="false"><rect width="10" height="10"></rect></svg></div><div class="akerZd" jsaction="click:nupQLb" role="link" aria-label="다운로드" tabindex="0"><svg width="24px" height="24px" viewBox="0 0 24 24" focusable="false" class="undefined a-s-fa-Ha-pa" fill="#000"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg><span class="wFZ5se">다운로드</span></div><div class="tohzcb"><div class="l-o-c-qd" aria-label="Google 드라이브 폴더"><svg x="0px" y="0px" focusable="false" viewBox="0 0 24 24" height="24px" width="24px" fill="#5f6368"><g><path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"></path><path d="M0 0h24v24H0z" fill="none"></path></g></svg></div></div><div class="TBiAlb"></div><div class="Q5txwe" data-tooltip="1. Java生产环境下性能监控与调优详解" aria-label="1. Java生产环境下性能监控与调优详解" data-tooltip-align="b,c" data-tooltip-delay="500" data-tooltip-unhoverable="true">1. Java生产环境下性能监控与调优详解</div></div></div></div></div><c-data id="c7" jsdata=" M2rjcd;_;$2 TofhHc;_;$4 GcheOd;1,15dEsvpvqkTASvktMVjW44Kb-TO30Jha0,driveweb|59+DXNbTd|59+b5wqU[1,&quot;15dEsvpvqkTASvktMVjW44Kb-TO30Jha0&quot;];$3 KCtMme;1AwrZdXeVr32w0dtdZ2NaVQ_Ysl4q-vWl;$5"></c-data></c-wiz>

比如你又如上类似文档,每一行都是类似的结构(这里只截取一行的数据)。
首先,找到截取目标字段的前后定位,比如我们这里截取 1. Java生产环境下性能监控与调优详解。找到它的前后定位识别字符串,很容易发现前定位识别串为 true">,后定位识别串是 </div></div></
然后,转译sed中的特殊字符,sed命令中的转译字符串是 \,进行转译;
最后,拼成我们的目标语句就是

sed 's/.*true\">//;s/<\/div><\/div><\/.*//;' ~/Documents/gdrive.xml