[英]Replace a specific character at any word's begin and end in bash
僅當它與模式“space-[AZ]”或“[AZ]-space”匹配時,我才需要刪除連字符“-”字符。 (假設所有字母都是大寫,空格可以是空格或換行符)
樣本.txt
I AM EMPTY-HANDED AND I- WA-
-ANT SOME COO- COOKIES
我希望輸出是
I AM EMPTY-HANDED AND I WA
ANT SOME COO COOKIES
我已經使用 sed 和 awk 以及 perl 四處尋找答案,但我只能找到與刪除兩個模式或特定字符串之間的所有字符有關的答案,而不是 [AZ] 和空格之間的特定字符。
謝謝堆!!
如果perl
是您的選擇,您會嘗試以下操作嗎:
perl -pe 's/(^|(?<=\s))-(?=[A-Z])//g; s/(?<=[A-Z])-((?=\s)|$)//g' sample.txt
(?<=\\s)
是一個零寬度的后視斷言,它匹配前導空格而不將其包含在匹配的子字符串中。(?=[AZ])
是一個零寬度先行斷言,它匹配 A 和 Z 之間的尾隨字符,而不將其包含在匹配的子字符串中。s/..//g
是第一個語句s/..//g
翻轉版本。你能不能試試以下。
awk '{for(i=1;i<=NF;i++){if($i ~ /^-[a-zA-Z]+$|^[a-zA-Z]+-$/){sub(/-/,"",$i)}}} 1' Input_file
添加非單襯形式的溶液:
awk '
{
for(i=1;i<=NF;i++){
if($i ~ /^-[a-zA-Z]+$|^[a-zA-Z]+-$/){
sub(/-/,"",$i)
}
}
}
1
' Input_file
輸出如下。
I AM EMPTY-HANDED AND I WA
ANT SOME COO COOKIES
如果您可以為sed
提供擴展正則表達式(通常使用-E
或-r
選項),那么您可以將sed
表達式縮短為:
sed -E 's/(^|\s)-(\w)/\1\2/g;s/(\w)-(\s|$)/\1\2/g' file
基本形式是sed -E 's/find1/replace1/g;s/find2/replace2/g' file
,也可以寫成單獨的表達式sed -E -e 's/find1/replace1/g' -e 's/find2/replace2/g'
(您的選擇)。
s/find1/replace1/g
的詳細信息是:
find1
是
(^|\\s)
定位並捕獲開頭或空格,'-'
連字符,\\w
(word-character); 和replace1
只是\\1\\2
使用前兩個反向引用重新插入兩個捕獲。下一個替換表達式是類似的,除了現在您要查找的是連字符后跟一個空格或末尾。 所以你有了:
find2
是
\\w
(字字符)的捕獲,(\\s|$)
,然后replace2
和以前一樣,只是使用反向引用重新插入捕獲的字符。 在每種情況下, g
表示所有出現的全局替換。
(注意: \\w
單詞字符還包括'_'
(下划線),因此雖然您不太可能將連字符和下划線放在一起,但如果您這樣做,則需要使用[A-Za-z]
列表而不是\\w
)
示例使用/輸出
在你的情況下,輸出是:
$ sed -E 's/(^|\s)-(\w)/\1\2/g;s/(\w)-(\s|$)/\1\2/g' file
I AM EMPTY-HANDED AND I WA
ANT SOME COO COOKIES
僅當它與模式 'space-[AZ]' 或 '[AZ]-space' 匹配時,才刪除連字符 '-' 字符。 假設所有字母都是大寫,空格可以是空格或換行符
它的:
sed 's/\( \|^\)-\([A-Z]\)/\1\2/g; s/\([A-Z]\)-\( \|$\)/\1\2/g'
s
- 替代
/
\\( \\|^\\)
- 空格或行首-
- 連字符...\\(AZ]\\)
- 單個大寫字符/
\\1\\2
- \\1
被第一個\\(...\\)
替換。 所以它被一個空格或什么都代替。 \\2
被找到的單個大寫字符替換。 有效-
被刪除。/
g
全局應用正則表達式;
- 將兩個s
命令分開s
$
表示行尾。awk '{sub(/ -/,"");sub(/^-|-$/,"");sub(/- /," ")}1' file
I AM EMPTY-HANDED AND I WA
ANT SOME COO COOKIES
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.