簡體   English   中英

在 bash 中替換任何單詞開頭和結尾的特定字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM