【问题标题】:sed matching lines beginning with * and //sed 匹配以 * 和 // 开头的行
【发布时间】:2023-03-04 09:51:01
【问题描述】:

我想转换一些 java 文件并将变音符号 Ö、ä 和 ü 替换为 unicode。

这是我的 sed 行:

sed -i '{ /^(#|\*$)/!s/0xE4/0xE4/g;/#/!s/Ä/0xC4/g;/#/!s/ö/0xF6/g;/#/!s/Ö/0xD6/g;/#/!s/ü/0xFC/g;/#/!s/Ü/0xDC/g; }' 

场景:

在 sed 之前它看起来像:

# comment with umlauts ÄÄÄÄÄÄÖÖÖÖÖ

ÖÖÖÖÖÖÖÖÖ

// comment with umlauts ÄÄÄÄÄÄÖÖÖÖÖ

 Text text text ÄÄÄÄÄÖÖÖÖÖ

/*
 * comment with umlauts ÄÄÄÄÄÄÖÖÖÖÖ
 */

之后应该是这样的:

 # comment with umlauts ÄÄÄÄÄÄÖÖÖÖÖ

 0xD60xD60xD60xD60xD60xD60xD60xD60xD60xD60xD60xD6

// comment with umlauts ÄÄÄÄÄÄÖÖÖÖÖ

 Text text text 0xC40xC40xC40xC40xC40xD60xD60xD60xD60xD6


/*
 * comment with umlauts ÄÄÄÄÄÄÖÖÖÖÖ
 */

谁能帮我匹配一下? - 我有,但它不能正常工作:

/^(#|\*$)/!

【问题讨论】:

  • 您到底想达到什么目的?用出现在 cmets 之外的变音符号替换字符是什么? Java unicode 转义(\u1234)?字符串“0x12”?字符 0x12?

标签: linux unicode sed string-matching


【解决方案1】:

Posix sed

sed '\%^ *\(#\|//\|\*\|/\*\)%!{
 s/Ä/0xC4/g
 s/ö/0xF6/g
 s/Ö/0xD6/g
 s/ü/0xFC/g
 s/Ü/0xDC/g
}'

GNU sed

sed -r '\%^ *(#|//|\*|/\*)%!{
 s/Ä/0xC4/g
 s/ö/0xF6/g
 s/Ö/0xD6/g
 s/ü/0xFC/g
 s/Ü/0xDC/g
}'

更新了 ninjalj 的 cmets。真正的忍者编辑!

【讨论】:

  • 使用\%regex%而不是/regex/看起来会更干净,因为有linux标签,使用sed -r
  • @ninjalj +1 发表评论,因为 OP 想要走这条路,但我更喜欢便携性。
  • @ninjalj:实际上,我同意你对% 正则表达式分隔符的看法。更新
【解决方案2】:

sed 使用基本的正则表达式,所以你必须把( 写成\(| 写成\|

【讨论】:

  • 感谢您的回答,我已经更改了我的 sed 匹配 sed -i '{ /^\(#\|\*$\|\\\\\)/! 但他仍然替换了以 * 和 // 开头的行中的变音符号。
  • 我将一些 sed 语句组合在一起 sed -i '{ /^\(#\|\*\|\\\\\)/!s/0xE4/0xE4/g;/#/!s/Ä/0xC4/g;/#/!s/ö/0xF6/g;/#/!s/Ö/0xD6/g;/#/!s/ü/0xFC/g;/#/!s/Ü/0xDC/g; }' {} \
  • 现在它只在行首匹配*,但在您的示例中,您希望它在行首匹配,或在一些空格后的行首附近匹配。
猜你喜欢
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2016-05-02
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多