$ echo -e "AsometAhingA\nsomethingA\nASomethiAng"
AsometAhingA
somethingA
ASomethiAng
$ echo -e "AsometAhingA\nsomethingA\nASomethiAng" | sed "s/A//"
sometAhingA
something
SomethiAng
$
Run Code Online (Sandbox Code Playgroud)
我知道sed "s/A//"删除每一行中的第一个匹配项。但我只想删除文本文件或流中的第一个匹配项。我怎样才能做到这一点?喜欢:sed -i "MAGIC" file.txt
我很难用 sed 替换 XML 文件中的文本字符串,尽管我使用 grep 查找相同的字符串没有问题。由于要替换的新字符串和旧字符串包含很多特殊字符,我认为最好将它们存储在变量中,而不是使用大量反斜杠:
OLD_STRING='<property name="webServiceHost">${jboss.bind.address}</property>'
NEW_STRING='<!--<property name="webServiceHost">${jboss.bind.address}</property>-->'
Run Code Online (Sandbox Code Playgroud)
字符串似乎按预期存储:
$ echo $OLD_STRING; echo $NEW_STRING
<property name="webServiceHost">${jboss.bind.address}</property>
<!--<property name="webServiceHost">${jboss.bind.address}</property>-->
Run Code Online (Sandbox Code Playgroud)
Grep'ing 确认旧字符串存在于 XML 文件中:
$ grep "$OLD_STRING" jboss-beans.xml
<property name="webServiceHost">${jboss.bind.address}</property>
Run Code Online (Sandbox Code Playgroud)
但是以下 sed 命令不会产生任何输出:
sed -i 's/"$OLD_STRING"/"$NEW_STRING"/g' jboss-beans.xml
Run Code Online (Sandbox Code Playgroud)
知道我在这里缺少什么吗?
我希望有一种方法让 sed 用替换(而不仅仅是匹配)替换整行,这样我就可以做这样的事情:
sed -e "/$some_complex_regex_with_a_backref/\1/"
Run Code Online (Sandbox Code Playgroud)
并让它只打印反向引用。
从这个问题来看,似乎这样做的方法是使用正则表达式来匹配整行,或者使用其他工具(如 perl)。简单地更改regexto.*regex.*并不总是有效(如该问题中所述)。例如:
$ echo $regex
\([:alpha:]*\)day
$ echo $phrase
it is Saturday tomorrow
$ echo $phrase | sed "s/$regex/\1/"
it is Satur tomorrow
$ echo $phrase | sed "s/.*$regex.*/\1/"
$ # what I'd like to have happen
$ echo $phrase | [[[some command or string of commands]]]
Satur
Run Code Online (Sandbox Code Playgroud)
假设以下情况,我正在寻找最简洁的方法来做到这一点:
我正在尝试删除第一次出现的 digit(s)、点、第二次出现的 digit(s)和单词之前的空格。
我想出了这个正则表达式:
sed 's/^[0-9]\+.[0-9]\+\s//' input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
文本示例:
2.14 Italien
2.15 Japonais
Run Code Online (Sandbox Code Playgroud)
不幸的是,我的正则表达式不起作用。有问题,\s但我无法确定它是什么......
任何人都可以帮忙吗?
编辑:问题是我只需要删除第一个空格,因为某些文本包含空格,如下所示:
3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau
Run Code Online (Sandbox Code Playgroud) sed至少可以说对我来说是陌生的。我想遍历一个 C 项目树并注释掉调用函数的每一行LogMsg()。可以实现以下目标的东西:
foreach: line within *.c
if: line contains "LogMsg"
prepend "//"
Run Code Online (Sandbox Code Playgroud)
或者。另外,我想看看我是否可以实现相反的目标,尽管我认为这可能会更困难。
我觉得这sed是完成这项工作的合适工具,但我不是批处理文本文件编辑方面的专家。有什么帮助吗?
我将创建一个 .sh 以使用其他文件的内容替换文件中的特定关键字。
sed 可用于替换关键字:
value="hello superuser"
sed -e "s/__PLACEHOLDER__/${value}/g" template.html > page.html
Run Code Online (Sandbox Code Playgroud)
所以我尝试了以下方法:
value=$(<contents.html)
sed -e "s/__PLACEHOLDER__/${value}/g" template.html > page.html
Run Code Online (Sandbox Code Playgroud)
并收到以下错误消息:替代模式内未转义的换行符
请问这种情况怎么处理?
谢谢!
我有一个使用 SSH 在远程服务器上运行命令的脚本。我想将字符串添加Remote:到输出的每一行,但我不希望每一行都被延迟,直到整行可用。这是我的命令的输出:
$ myproject-db-push my_database_name 从数据库导出...完成 归档数据...完成 上传档案到远程...完成 在远程运行安装脚本 远程:将存档解压缩到临时目录...完成 远程:使用数据库:my_database_name 远程:删除集合: 远程:- my_collection_foo 远程:- my_collection_bar 远程:导入新数据...完成
在这种情况下,我是这样使用的sed:
echo "$INSTALLCMD" | ssh -T "deploy@$SERVER" | sed -u "s/^/Remote: /"
Run Code Online (Sandbox Code Playgroud)
问题是,正如我所解释的,没有部分行打印到屏幕上。如果我移除| sed零件,它会按预期工作。首先是这样写的:
正在导入新数据...
几秒钟后,该行完成:
正在导入新数据...完成
我假设sed只能逐行工作。我尝试将其设置为无缓冲,但它仍然等待整行。有没有另一种方法来实现这一点?
我想循环文件
for f in `grep -rsl "foo" . `: do sed -i -- "s/foo/bar/g" $f; done;
但由于文件名包含空格,因此只要找到空格,就会拆分文件名。
如何将文件名及其空格传递给do块?
使用sed到包含某些字符适用于字符串常量使用使文字很简单:
sed "s/\\\\/\\\\\\\\/g"
sed "s/\\\"/\\\\\\\"/g"
Run Code Online (Sandbox Code Playgroud)
但是如何对包含换行符的文本文件做类似的事情呢?
当我想要的状态存在时,我想更改文件中的单元格。例子:
文件:
id311 vmName1 state0
id312 vmName2 state0
id313 vmName3 state0
Run Code Online (Sandbox Code Playgroud)
我将键入一个脚本,该脚本仅更改一行的状态列。所以如果我输入sed -i 's/state0/state1/g'all state0's be state1。我只想更改一行的状态,例如:
文件:
id311 vmName1 state0
id312 vmName2 state1
id313 vmName3 state0
Run Code Online (Sandbox Code Playgroud)
如何将sed命令用于带有 use id 的特殊行?注意:id 是唯一的。