Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中的文件中的特定行末尾追加字符串_Bash_Sed_Awk - Fatal编程技术网

如何在bash中的文件中的特定行末尾追加字符串

如何在bash中的文件中的特定行末尾追加字符串,bash,sed,awk,Bash,Sed,Awk,我想在主机文件的某一行末尾附加一个别名。比如说 我有 192.168.1.1 www.address1.com 192.168.1.2 www.address2.com 192.168.1.3 www.address3.com 我想让它看起来像 192.168.1.1 www.address1.com 192.168.1.2 www.address2.com myalias 192.168.1.3 www.address3.com 我想找到包含19.2.6

我想在主机文件的某一行末尾附加一个别名。比如说

我有

192.168.1.1    www.address1.com
192.168.1.2    www.address2.com
192.168.1.3    www.address3.com
我想让它看起来像

192.168.1.1    www.address1.com
192.168.1.2    www.address2.com myalias
192.168.1.3    www.address3.com

我想找到包含19.2.68.1.2的行,并在其末尾附加myalias。这一行不一定是文件中的第二行,就像我在这里展示的那样。它可以在任何地方。

使用
sed
和描述的模式:

sed '/192.168.1.2/s/$/ myalias/' file


使用
sed
和特定行号:

sed '2s/$/ myalias/' file

也可以使用
awk
解决方案:

awk '{if (/^192\.168\.1\.2 /) {$0=$0 " myalias"}; print}' hosts
上面的代码逐个读取
主机
文件中的行。如果行的开头有我们的IP地址,则将
myalias
追加到行中。然后将该行打印到
stdout

注意两件事。在
if
条件下,IP地址后面有一个空格。否则,正则表达式可以匹配
192.168.1.20
等。此外,IP地址中的句点用反斜杠转义。否则,它们可以匹配任何字符

更简洁的解决方案形式是:

awk '/^192\.168\.1\.2 /{$0=$0 " myalias"}1' hosts

下面是另一种使用
awk

awk '/search pattern/{print $0 " myalias"; next}1'  file

我将使用
awk
,因为您可以使用字符串,而不必使用正则表达式,在正则表达式中需要转义点,并且需要使用锚和/或单词边界。还可以确保字符串与第1列中的值匹配

awk '$1==s{$0=$0 OFS alias}1' s=192.168.1.2 alias=myalias file

此外,当它是较大脚本的一部分时,能够使用变量字符串也很好。使用
sed
您需要shell变量和引用技巧。

问题并不完全相同,但有些答案是相同的。
awk'/^192.168\.1\.2/{$0=$0“myalias”}7'主机
@Kent谢谢。我加了一句。如何使这种变化到位?有比我的肮脏的黑客更好的解决方案吗
awk'{if(/^After\=/){$0=$0“postgresql.service”};print}'jetty.service>jetty.service.tmp&&mv-f jetty.service.tmp jetty.service
@gouessej如果您的
awk
是BSD(MacOS),那么您的黑客攻击就是正确的解决方案。如果您的
awk
是GNU(Linux、homebrew等),则可以使用
-i inplace
选项。OP不需要
\n
:)而且此cmd将只打印匹配的行,这可能不是OP希望看到的。是从电话里接的,从电话里的格式来看,这是一条新的线路。谢谢你指出这一点<代码>:)吸取的教训。不要接电话!杰帕尔,你需要一个“智能”手机!我猜你在用iphone,对吗?不够聪明…:)
sed'2s/$/myalias/'file>file
将文件设为空,我们有没有办法将输出保存在同一个文件中?@Chauhan:通过就地编辑:
sed-i.bak'2s/$/myalias/'file
或干脆
sed'2s/$/myalias/'file>file.tmp&&mv file.tmp file