我有一个文件,除了最后一行之外,每行末尾都应该有特定的字符/字符串。如何通过 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\}
/ ?
) 尾随 ( $
)替换1
为1
。
答案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
存在的地方。s/^\(.*\)1$/\1/
- 然后将其添加回所有行。
s/.*/&1/
- 但仅适用于不是最后一行的行
$!{…}
sed '$!{s/^\(.*\)1$/\1/;s/.*/&1/}' file
或者,不捕获任何内容(无星号),两者之一:
sed '$!{s/1$//;s/$/1/}' file
sed '/1$/b;$!s/$/1/' file