2017-01-02 111 views
1

如何從字符串中替換最後一個字符(它是})?我需要最後一個字符前的所有內容,但用一些新字符串替換最後一個字符。替換字符串中的最後一個字符

我用awk和sed嘗試了很多東西,但沒有成功。

例如:

...\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural 
\\f0 
}' 

應該變成:

...\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural 
\\f0 
\\cf2 Its red now 
}' 

這將替換最後一次出現:

} 

\\cf2 Its red now 
} 
+0

不是一個確切的重複,但非常接近:我如何可以替換在bash另一個字符的字符串的最後一個字符?(http://stackoverflow.com/q/19169175/3266847) –

回答

1

的sed這樣做:

# replace '}' in the end 
echo '\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural \f0 }' | sed 's/}$/\\cf2 Its red now}/' 

# replace any last character 
echo '\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural \f0 }' | sed 's/\(.\)$/\\cf2 Its red now\1/' 
1

更換後}可以這樣做(與$爲PS1提示和>爲PS2提示符):

$ str="...\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural 
> \\f0 
> }" 
$ echo "$str" 
...\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural 
\f0 
} 
$ echo "${str%\}}\cf2 It's red now 
}" 
...\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural 
\f0 
\cf2 It's red now 
} 
$ 

第3行將您的字符串分配給我的變量str。接下來的4行顯示了字符串中的內容。 2行:

echo "${str%\}}\cf2 It's red now 
}" 

包含您請求的材料(文法校正)替換,最後一行回顯替代值。

基本上,${str%tail}$str的末尾刪除字符串tail;我記得%以't'結尾(類似的${str#head}具有以'h'開頭的散列值)。

請參閱Bash手冊中的shell parameter expansion瞭解其餘詳細信息。

如果你不知道的最後一個字符,你可以使用一個?元字符結尾,而不是匹配:

echo "${str%?}and the extra" 
0

首先請用換行

str=$(printf "%s\n%s\n%s" '\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural' '\\f0' "}'") 

你看看現在的字符串最後}在您的字符串中,並將其替換爲換行符。
$確保它只會在最後一行代替它,&代表匹配字符串。

echo "${str}" |sed '$ s/}[^}]$/\\\\cf2 Its red now\n&/' 

上述解決方案僅適用於}位於最後一行時。它變得更加困難,當你也想支持str2

str2=$(printf "Extra } here.\n%s\nsome other text" "${str}") 

你不能在最後一行匹配}。刪除最後一行的地址$將導致替換所有}字符(我在str2的開頭添加了})。你只想替換最後一個。
更換一次是以..../1強制執行。通過使用tac顛倒行的順序來完成最後而不是第一個。由於替換後您將再次使用tac,因此您需要在sed替換字符串中使用不同的順序。

echo "${str2}" | tac |sed 's/}[^}]$/&\n\\\\cf2 Its red now/1' |tac 
0

在awk中:

$ awk ' BEGIN { RS=OFS=FS="" } $NF="\\\\cf2 Its red now\n}"' file 
  • RS=""RS到一個空的記錄(將其更改爲滿足您的需求)
  • OFS=FS=""分離字符的每個到它自己的領域
  • $NF="\\\\cf2 Its red now\n}"內容替換最後一個字段中的字符($NF=})與引用文字
+0

您的命令給我2個大括號: ... \\ \\ tx4535 \\ tx5102 \\ tx5669 \\ tx6236 \\ tx6803 pardirnatural \\ F0 } \\ CF2它的紅色現在 } \t #Please糾正。 –

+0

@ClaesWikner它替換字符串_it的一個'}'_中的最後一個字符。如果它不是最後一個,那麼最後的任何內容都會被替換,並且原來的'}'保持在那裏。 –

0
awk '{sub(/\\f0/,"\\f0\n\\\\\cfs Its red now")}1' file 

...\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural 
\\f0 
\\cfs Its red now 
}' 
相關問題