请教:如何用sed 删除 emacs lisp 风格的以 (load 这5个字符开头的行?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
careone
帖子: 839
注册时间: 2007-12-17 21:41

请教:如何用sed 删除 emacs lisp 风格的以 (load 这5个字符开头的行?

#1

帖子 careone » 2012-08-21 19:48

请教:如何用sed 删除 emacs lisp 风格的 以 (load 这5个字符开头的行?

文件: ~/.emacs

代码: 全选

;; AUTO ADDED BY EMACS-LOCALE
(load "/etc/emacs/site-start.d/locale/zh-cn-2")
;; EMACS-LOCALE END
;; AUTO ADDED BY EMACS-LOCALE
(load "/etc/emacs/site-start.d/locale/zh-cn-1")
(load "/etc/emacs/site-start.d/locale/zh-cn-1")
(load "/etc/emacs/site-start.d/locale/zh-cn-1")
(load "/etc/emacs/site-start.d/locale/zh-cn-2")
(load "/etc/emacs/site-start.d/locale/zh-cn-1")
;; EMACS-LOCALE END
已知:
× 对 / (1字符)转义成 \/ (2字符);
× 左括号,空格,双引号,右括号,原则上似乎不用转义,如果转义后可以实现目的,
应如何转义: 是否应像单引号,进行1转4方式的转义?即 ' 一个字符,转义成 '\'' 四个字符?

现行方案:

代码: 全选

sed -i '/^;; AUTO ADDED BY EMACS-LOCALE/d' $HOME/.emacs
sed -i '/^;; EMACS-LOCALE END/d' $HOME/.emacs
这两行语句可以正常删除两行目标行,但 以 (load 开头的语句无法实现删除。请高人指点.
已执行方案:

代码: 全选

sed -i '/^\(load\ \"\/etc\/emacs\/site-start.d\/zh-cn-1"\)/d' $HOME/.emacs
sed -i '/^\(load\ \"\/etc\/emacs\/site-start.d\/zh-cn-2"\)/d' $HOME/.emacs
另外找到网上其它sed删除重复行的方案,经操作证实对本文件无效。
环境:ubuntu 10.04.3 i386, gnu sed 4.2.1,sh

代码: 全选

sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' $HOME/.emacs
sed -i '$!N; /^\(.*\)\n\1$/!P; D'  $HOME/.emacs
删除原则:
* 一定要是以 (load 这5个字符开头,并且后面的文字完全相符的行才能执行删除,
避免误删除别人设置的 load 语句。
* 不能进行sort 排序操作,避免文字顺序混乱;
* 尝试过先通过 sed -i 's/aa/bb/;bb/' ~/.emacs 进行替换,再将替换过的新内容删除,但仍无法见效。
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
头像
Methuselar
帖子: 122
注册时间: 2009-06-04 12:06
联系:

Re: 请教:如何用sed 删除 emacs lisp 风格的以 (load 这5个字符开头的行?

#3

帖子 Methuselar » 2012-08-22 12:17

描述自相矛盾,想要得到什么?
Mea Culpa!
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 请教:如何用sed 删除 emacs lisp 风格的以 (load 这5个字符开头的行?

#4

帖子 naturalaw » 2012-08-22 14:03

一定要是以 (load 这5个字符开头,并且后面的文字完全相符的行才能执行删除,
(load "/etc/emacs/site-start.d/locale/zh-cn-1")
另外找到网上其它sed删除重复行的方案,经操作证实对本文件无效。
看来你要是删除以(load开头的重复行咯而且还不能排序,或者说,大写字母下的路经,不能重复出现

你不排序怎么行 uniq也要排序才能删除重复行,否则只能删除相邻重复行。
这么点文件,手动删除吧。vi ...然后dd
  • The eternal law
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 请教:如何用sed 删除 emacs lisp 风格的以 (load 这5个字符开头的行?

#5

帖子 naturalaw » 2012-08-22 14:24

不确定是不是 一定有大写字母那一行下面,如果有,也可以这样来,给内容分个组。
大写字母那一行+小写字母的n行,组合,得到k个组合,然后依次对这k个组合排序uniq,然后重组。
  • The eternal law
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 请教:如何用sed 删除 emacs lisp 风格的以 (load 这5个字符开头的行?

#6

帖子 lilydjwg » 2012-08-22 15:05

[bash]
awk '
{dont = 0;}
/^\(load/{
if(a[$0]){
dont = 1;
}else{
a[$0] = 1;
}
}{
if(!dont){
print;
}
}
' your_file > output_file
[/bash]
头像
careone
帖子: 839
注册时间: 2007-12-17 21:41

Re: 请教:如何用sed 删除 emacs lisp 风格的以 (load 这5个字符开头的行?

#7

帖子 careone » 2012-09-01 3:50

naturalaw 写了:
一定要是以 (load 这5个字符开头,并且后面的文字完全相符的行才能执行删除,
(load "/etc/emacs/site-start.d/locale/zh-cn-1")
另外找到网上其它sed删除重复行的方案,经操作证实对本文件无效。
看来你要是删除以(load开头的重复行咯而且还不能排序,或者说,大写字母下的路经,不能重复出现

你不排序怎么行 uniq也要排序才能删除重复行,否则只能删除相邻重复行。
这么点文件,手动删除吧。vi ...然后dd
因为考虑的是要以程序方式来加入 emacs 的汉化包,并对配置文件进行命令式的修改,可能会多次执行命令,多次修改,所以希望能有一个正式点的解决方案。直接手动修改对不了解程序工作结构的用户,不是一个有效的方案。

还是很感谢关注!
魁拔不死,天下不宁。
魁拔既死,天下不平。
--------------
Careone <emacslocale^126.com>
https://sourceforge.net/projects/emacslocale/files/
回复