我正在嘗試在文本檔案中的最后一個模式匹配之后添加以下字串。
文本檔案
<MultiGeometry>
<Polygon>1
</Polygon>
<Polygon>2
</Polygon>
<Polygon>3
</Polygon>
<Polygon>4
</Polygon>
<Polygon>5
</Polygon>
嘗試的代碼
sed -i '/<\/Polygon>/a</\MultiGeometry>' text_file
此代碼在文本檔案中的</MultiGeometry>每個匹配之后插入</Polygon> 而不是最后一個匹配。</Polygon>
當前結果
<MultiGeometry>
<Polygon>1
</Polygon>
</MultiGeometry>
<Polygon>2
</Polygon>
</MultiGeometry>
<Polygon>3
</Polygon>
</MultiGeometry>
<Polygon>4
</Polygon>
</MultiGeometry>
<Polygon>5
</Polygon>
</MultiGeometry>
預期結果
<MultiGeometry>
<Polygon>1
</Polygon>
<Polygon>2
</Polygon>
<Polygon>3
</Polygon>
<Polygon>4
</Polygon>
<Polygon>5
</Polygon>
</MultiGeometry>
uj5u.com熱心網友回復:
Perl 解決方案:
tac text_file | perl -lpe 'next LINE if $seen; s{</Polygon>}{$&</MultiGeometry>} and $seen ;' > temp
mv temp text_file
tac:以相反的順序列印行,從最后到第一個。
Perl 單行器使用這些命令列標志:
-e:告訴 Perl 查找行內代碼,而不是在檔案中。
-n:一次回圈輸入一行,$_默認情況下將其分配給。
-p:一次回圈輸入一行,$_默認情況下將其分配給。print $_在每次回圈迭代后添加。
-l: 在執行行內代碼之前去除輸入行分隔符("\n"默認情況下在 *NIX 上),并在列印時附加它。
$&:匹配的模式,在這里</Polygon>。
$seen: undef(false) 如果我們還沒有替換,1(true) 如果我們有。允許對模式進行 1 次且僅 1 次替換,從末尾開始的第一個 = 原始檔案中的最后一個。
uj5u.com熱心網友回復:
使用sed但指示$(檔案或 LHS 結果中的最后一行)作為地址
sed -irn '/<[/]Polygon>/ { $ s@</Polygon>@&</MultiGeometry>@ }' list1.txt
sed表達部分
/<[/]Polygon>/獲取所有匹配模式
{ $ s@</Polygon>@&</MultiGeometry>@ }的行僅在匹配的最后一行進行替換。$表示最后一行,&指的是整個 LHS 模式。
注意:@用于代替sed 運算式/以s/ / /獲得更好的可讀性,因為正斜杠不需要轉義。
uj5u.com熱心網友回復:
使用gnu-sed你可以使用-z標志和匹配.*</Polygon>來確保匹配最后</Polygon>,因為.*在匹配之前匹配最長匹配是貪婪的</Polygon>。
sed -z 's~.*</Polygon>~&\n</MultiGeometry>~' file
<MultiGeometry>
<Polygon>1
</Polygon>
<Polygon>2
</Polygon>
<Polygon>3
</Polygon>
<Polygon>4
</Polygon>
<Polygon>5
</Polygon>
</MultiGeometry>
uj5u.com熱心網友回復:
使用sed
$ sed -e '\|</Polygon>|{$a\</MultiGeometry>' -e '}' input_file
<MultiGeometry>
<Polygon>1
</Polygon>
<Polygon>2
</Polygon>
<Polygon>3
</Polygon>
<Polygon>4
</Polygon>
<Polygon>5
</Polygon>
</MultiGeometry>
uj5u.com熱心網友回復:
這是另一種方法,使用tac awk組合tac。
tac Input_file |
awk -v RS="" '{sub(/<\/Polygon>/,"</MultiGeometry>\n&")} 1' |
tac
解釋:簡單的解釋是,tac首先使用 Input_file 將檔案行列印成相反的順序(從底部到第一行)并將其輸出作為輸入傳遞給awk程式。在awk程式設定RS(記錄分隔符)為 NULL 并在其主程式中使用sub替換</Polygon>和</MultiGeometry>自身(使用&),然后使用1是awk列印當前行的 sh 方式。進一步將awk代碼的輸出作為輸入發送到tac命令以獲取實際的行順序。
uj5u.com熱心網友回復:
這是一個相對靈活的解決方案,它可以解釋的不僅僅是多邊形:
代碼
{m,g}awk -v __='Octinions' '
BEGIN {
OFS = FS = (__) ">"
sub(".$","[&]",FS)
RS = "^$"
ORS = ""
} END {
if (NF == !_) {
print "none found"
exit
}
if (($!_) ~ "[^<]$") {
match($!_, "[^<>\n]*$")
___ = "</" substr($!_, RSTART) (OFS)
} else {
match($!_, "[^\n<>] [>][\n][<]?[/]?$")
___ = "</" substr($!_, RSTART)
sub("[\n][^\n]*$","",___)
}
sub("[\n]","&"___"&",$NF)
print
}'
輸出
<Category_Fields>
<Fields>1
</Fields>
<Fields>2
</Fields>
<Fields>3
</Fields>
<Fields>4
</Fields>
<Fields>5
</Fields>
<Category_Transcendatals>
<Transcendatals>1
</Transcendatals>
<Transcendatals>2
</Transcendatals>
<Transcendatals>3
</Transcendatals>
<Transcendatals>4
</Transcendatals>
<Transcendatals>5
</Transcendatals>
<Category_Distributions>
<Distributions>1
</Distributions>
<Distributions>2
</Distributions>
<Distributions>3
</Distributions>
<Distributions>4
</Distributions>
<Distributions>5
</Distributions>
<Category_Octinions>
<Octinions>1
</Octinions>
<Octinions>2
</Octinions>
<Octinions>3
</Octinions>
<Octinions>4
</Octinions>
<Octinions>5
</Octinions>
</Category_Octinions>
<Category_EuclidianPlane>
<EuclidianPlane>1
</EuclidianPlane>
<EuclidianPlane>2
</EuclidianPlane>
<EuclidianPlane>3
</EuclidianPlane>
<EuclidianPlane>4
</EuclidianPlane>
<EuclidianPlane>5
</EuclidianPlane>
<Category_ComplexPlane>
<ComplexPlane>1
</ComplexPlane>
<ComplexPlane>2
</ComplexPlane>
<ComplexPlane>3
</ComplexPlane>
<ComplexPlane>4
</ComplexPlane>
<ComplexPlane>5
</ComplexPlane>
<Category_PartialDiff>
<PartialDiff>1
</PartialDiff>
<PartialDiff>2
</PartialDiff>
<PartialDiff>3
</PartialDiff>
<PartialDiff>4
</PartialDiff>
<PartialDiff>5
</PartialDiff>
<MultiGeometry>
<Polygon>1
</Polygon>
<Polygon>2
</Polygon>
<Polygon>3
</Polygon>
<Polygon>4
</Polygon>
<Polygon>5
</Polygon>
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed 'H;1h;$!d;x;s/.*<\/Polygon>/&\n<\/MultiGeometry>/' file
將檔案放入保存空間并使用貪婪,在最后一次出現</Polygon>.
替代的,更高效的記憶體(可能更慢):
sed '/<\/Polygon>/bb
x;/./!{x;p;d};x;H
:a;$!d;x;s/.*<\/Polygon>/&\n<\/MultiGeometry>/p;d
:b;x;/./p;x;h;ba' file
在第一次出現之前</Polygon>,正常列印行。
此后,保留以下行的副本,</Polygon>并僅在當前行為 時列印其內容</Polygon>。
在檔案末尾,搜索包含</Polygon>并附加所需字串的行的保留空間。
uj5u.com熱心網友回復:
使用 vim ex 模式
# to stdout
$ printf '%s\n' '0?</Polygon>?a' '</MultiGeometry>' . %p | ex input_file
<MultiGeometry>
<Polygon>1
</Polygon>
<Polygon>2
</Polygon>
<Polygon>3
</Polygon>
<Polygon>4
</Polygon>
<Polygon>5
</Polygon>
</MultiGeometry>
# inplace
$ printf '%s\n' '0?</Polygon>?a' '</MultiGeometry>' . x | ex input_file
$ cat input_file
<MultiGeometry>
<Polygon>1
</Polygon>
<Polygon>2
</Polygon>
<Polygon>3
</Polygon>
<Polygon>4
</Polygon>
<Polygon>5
</Polygon>
</MultiGeometry>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481323.html
上一篇:在頂部發送選項卡布局
