我的文件包含以下上下文,如
abc...
include /home/user/file.txt'
some text
我需要在include之后删除include和完整路径。
我使用了以下命令删除包含但未删除路径。
sed -i -r的#include ## g''filename'
我也试图理解上面的命令但是不理解下面的事情(从某处复制粘贴)
i - modify file change
r - read file
s- Need input
g - Need input
答案 0 :(得分:1)
试试这个,
$ sed '/^include /s/.*//g' file.txt
abc...
some text
删除以include
开头的行中的所有文本。 s
表示替代。所以s/.*//g
表示将所有文本替换为null。g
表示全局。替代将在全球范围内应用。
OR
$ sed '/^include /d' file.txt
abc...
some text
d
表示删除。
删除以include
开头的行。要保存所做的更改(内联编辑),您的命令应该是
sed -i '/^include /s/.*//g' file.txt
sed -i '/^include /d' file.txt
答案 1 :(得分:1)
我是你的情况,如果你只想删除第二行,你可以使用:
sed -i '2d' file
如果你想探索一些关于linux命令的东西,那么man page就在那里。 只需转到终端并输入:
man sed
根据你的问题,没有-i的上述命令将通过删除输入文件中的第二行来显示终端上的文件内容。但是,输入文件保持不变。要更新原始文件或在源文件中永久更改,请使用-i选项。
-i[SUFFIX], --in-place[=SUFFIX] :
edit files in place (makes backup if extension supplied)
-r or --regexp-extended :
option is to use extended regular expressions in the script.
s/regexp/replacement/ :
Attempt to match regexp against the pattern space. If success‐
ful, replace that portion matched with replacement. The
replacement may contain the special character & to refer to that
portion of the pattern space which matched, and the special
escapes \1 through \9 to refer to the corresponding matching
sub-expressions in the regexp.
g G : Copy/append hold space to pattern space.
答案 2 :(得分:1)
grep -v
这不是关于学习sed
,而是作为替代(和简短)解决方案,有:
grep -v '^include' filename_in
或者使用输出重定向:
grep -v '^include' filename_in > filename_out
-v
反转匹配的 grep
选项(因此打印不匹配的行)
对于简单的删除,我使用的是什么;如果您必须在include
之后修改路径,请改为使用sed
。
答案 3 :(得分:0)
您可以使用awk
删除该行:
awk '/^include/ {next}1' file
答案 4 :(得分:0)
sed -i -r 's#include##g' 'filename'
-i
:您直接修改处理后的文件,默认情况下,sed读取文件,通过stdout修改内容(原始文件保持不变)。
-r
:使用扩展正则表达式(而不是减少到POSIX限制的表达式)。在这种情况下,由于操作列表中简单的POSIX兼容操作(s###
字符串),这不是必需的。
s#pattern#NewValue#
:在当前行中用“Newvalue”(也使用内部缓冲区或特定值)替换模式(正则表达式)。传统形式是s///
但在这种情况下,在路径(模式或新值)中使用/
,使用替代形式来避免以模式或新值转义所有/
g
:是s###
的一个选项,指定每次更改而不是第一次(默认情况下)
所以在这里它将include
的任何出现直接替换为(删除)直接替换到您的文件中
答案 5 :(得分:0)
根据Avinash Raj
解决方案,您得到了您想要的内容,但您想要对sed
命令中使用的某些参数进行一些解释
第一个是
命令:s代替
使用sed
命令,替换命令s
将所有出现的正则表达式更改为新值。一个简单的例子是在“file2”文件中将“file1”中的“my”更改为“yours”:
sed s/my/yours/ file1 >file2
s
之后的字符是分隔符。它通常是斜杠,因为这是ed, more, and vi
使用的。然而,它可以是你想要的任何东西。如果要更改包含斜杠的路径名 - 比如/usr/local/bin to /common/bin
- 您可以使用反斜杠来引用斜杠:
sed 's/\/usr\/local\/bin/\/common\/bin/' <old >new
/ g - 全球替代
Replace all matches, not just the first match.
如果你告诉它改变一个单词,它只会改变一行中第一次出现的单词。您可能希望对行上的每个单词进行更改而不是第一个单词,然后在最后一个分隔符后添加g
并使用解决方法:
删除d
Delete the pattern space; immediately start next cycle.
您可以通过指定行号来删除行。像
sed '$d' filename.txt
它将删除文件的最后一行
sed '2 d' file.txt
它将删除第二行文件。
-i选项
This option specifies that files are to be edited in-place. GNU sed does this by creating a temporary file and sending output to this file rather than to the standard output.
要动态修改文件,您可以使用-i
选项,而不sed
命令重新发送stdout
更改而不是实际文件。您可以使用-i.bak
选项在修改前备份原始文件。
-r选项
--regexp-extended
使用扩展正则表达式而不是基本正则表达式。扩展的正则表达式是egrep接受的;它们可以更清晰,因为它们通常具有较少的反斜杠,但是是GNU扩展,因此使用它们的脚本不可移植。