如何在文件的每一行末尾查找特定字符/字符串,并在除了最后一行之外缺少该字符时添加该字符?

如何在文件的每一行末尾查找特定字符/字符串,并在除了最后一行之外缺少该字符时添加该字符?

我有一个文件,除了最后一行之外,每行末尾都应该有特定的字符/字符串。如何通过 shell 脚本实现此目的,在每行末尾搜索该字符/字符串并添加该字符/字符串(如果不存在)?

例如,文件内容如下:

hello1
hello
hell1
hel
end

它应该在除最后一行之外的每行末尾都有字符 1,并且我们的脚本的输出应该如下所示:

hello1
hello1
hell1
hel1
end

我认为它可以使用 sed 或 awk 编写,但我不确定它们是如何工作的。提前致谢。

答案1

一种方法可以是

 sed -e '
    s/1$/&/;t
    $!s/$/1/
' file 
sed -e '
  $q; /1$/!s/$/1/
' file

或者:

sed -e '$!{/1$/!s/$/1;}'

或者如果没有空行:

sed -e '$!s/[^1]$/&1/' 

答案2

另一种选择:

sed '$!s/1\{0,1\}$/1/'

(某些sed实现支持非标准\?作为 的替代\{0,1\})。

或者它的扩展正则表达式等效于那些sed支持的实现-E(很快将成为标准):

sed -E '$!s/1?$/1/'

也就是说,在除 ( !) 最后一个 ( $) 之外的所有行上,将一个可选的 ( \{0,1\}/ ?) 尾随 ( $)替换11

答案3

在每个 Unix 机器上的任何 shell 中使用任何 awk:

$ awk 'NR>1{print p 1} {sub(/1$/,""); p=$0} END{print p}' file
hello1
hello1
hell1
hel1
end

答案4

您可以(在 sed 中):

  1. 删除所有1存在的地方。 s/^\(.*\)1$/\1/
  2. 然后将其添加回所有行。 s/.*/&1/
  3. 但仅适用于不是最后一行的行$!{…}
sed '$!{s/^\(.*\)1$/\1/;s/.*/&1/}' file

或者,不捕获任何内容(无星号),两者之一:

sed '$!{s/1$//;s/$/1/}' file
sed '/1$/b;$!s/$/1/' file

相关内容