2012-05-14 76 views
0

我需要用`\ texthyphen'替換文檔中的所有-,但前提是它必須至少包含一個字母,不管前後是什麼,但前後都不會是數字。例如:如何查找和替換至少由一個字母和數字組成的項目?

  • A-B變成A\texthyphen B
  • a-b變成a\texthyphen b
  • %-b變成%\texthyphen b
  • %-%保持不變,因爲它不在任何字母附近。
  • 1-2不變,因爲它接近數字。
  • A-2不變,因爲它接近一個數字。

我怎樣才能用\texthyphen替換連字符,但只能在旁邊的一個字母,而不是在旁邊的數字?

回答

2
sed -e 's/\([[:alpha:]]\)-\([^[:digit:]]\)/\1\\texthyphen \2/g' -e 's/\([^[:digit:]]\)-\([[:alpha:]]\)/\1\\texthyphen \2/g' -e 's/^-\([:alpha:]\)/\\texthyphen \1/' 
1

我只是碰到ssed(超級sed),可以處理Perl的正則表達式一樣來了。它應該可以在類似Debian的系統上使用,不知道其他的。

$ echo ' A-B becomes A\texthyphen B. 
    a-b becomes a\texthyphen b. 
    %-b becomes %\texthyphen b. 
    %-% is unchanged, because it is not near any letter. 
    1-2 is unchanged, because it is near numbers. 
    A-2 is unchanged, because it is near one number.' | \ 
> ssed -R 's/(?<=[A-Za-z])-(?![0-9])|(?<![0-9])-(?=[A-Za-z])/\\texthyphen /g' 

A\texthyphen B becomes A\texthyphen B. 
    a\texthyphen b becomes a\texthyphen b. 
    %\texthyphen b becomes %\texthyphen b. 
    %-% is unchanged, because it is not near any letter. 
    1-2 is unchanged, because it is near numbers. 
    A-2 is unchanged, because it is near one number. 
1

這可能會爲你工作:

sed 's/\([[:alpha:]]\)-\([^[:digit:]]\)\|\([^[:digit:]]\)-\([[:alpha:]]\)/\1\3\\texthyphen \2\4/g' file 
相關問題