sed 命令在命令行中使用特殊字符查找字符串并将其替换为字符串
sed command to find and replace string with special characters to a string in command line
我正在尝试使用 sed find/replace .属性 文件中包含特殊字符的字符串。
这是我在文件中的原始行:
kylin.source.hive.beeline-params=-n root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*' -u jdbc:hive2://localhost:xxxx
我需要更换:
root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*'
和
hadoop
和其他字符串:
localhost
和
ip-00-00-00-000.ec2.internal
最终输出需要如下所示:
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx
我使用 sed 尝试了几种不同的格式:
sudo sed -i 's/root --hiveconf hive\.security\.authorization\.sqlstd\.confwhitelist\.append=\'mapreduce\.job\.\*\|dfs\.\*\'/hadoop' /usr/local/kylin/kylin.properties
sudo sed -i 's/root \-\-hiveconf hive\.security\.authorization\.sqlstd\.confwhitelist\.append\=\'mapreduce\.job\.\*\|dfs\.\*\'/hadoop' /usr/local/kylin/kylin.properties
sudo sed -r 's/root \-\-hiveconf hive\.security\.authorization\.sqlstd\.confwhitelist\.append\=\'mapreduce\.job\.\*\|dfs\.\*\'/hadoop' /usr/local/kylin/kylin.properties
当我执行上述命令时我没有得到任何输出,它正在等待另一个 input.Can 有人帮助我解决这个问题?
这里:
sed -i "s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g" /usr/local/kylin/kylin.properties
将输出:
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx
或仅替换文件中的第一次出现:
sed -i "0,/root.*dfs/{s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g}" /usr/local/kylin/kylin.properties
当您想用文字字符串替换文字字符串时,请使用像 awk 这样理解文字字符串的工具,而不是像 sed 这样只理解正则表达式和支持反向引用的替换的工具,然后您需要小心地转义不同方式的元字符和定界符(参见 :
$ cat tst.awk
BEGIN {
map["root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*'"] = "hadoop"
map["localhost"] = "ip-00-00-00-000.ec2.internal"
}
{
for (str in map) {
if ( s = index([=10=],str) ) {
[=10=] = substr([=10=],1,s-1) map[str] substr([=10=],s+length(str))
}
}
print
}
$ awk -f tst.awk file
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx
我正在尝试使用 sed find/replace .属性 文件中包含特殊字符的字符串。
这是我在文件中的原始行:
kylin.source.hive.beeline-params=-n root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*' -u jdbc:hive2://localhost:xxxx
我需要更换:
root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*'
和
hadoop
和其他字符串:
localhost
和
ip-00-00-00-000.ec2.internal
最终输出需要如下所示:
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx
我使用 sed 尝试了几种不同的格式:
sudo sed -i 's/root --hiveconf hive\.security\.authorization\.sqlstd\.confwhitelist\.append=\'mapreduce\.job\.\*\|dfs\.\*\'/hadoop' /usr/local/kylin/kylin.properties
sudo sed -i 's/root \-\-hiveconf hive\.security\.authorization\.sqlstd\.confwhitelist\.append\=\'mapreduce\.job\.\*\|dfs\.\*\'/hadoop' /usr/local/kylin/kylin.properties
sudo sed -r 's/root \-\-hiveconf hive\.security\.authorization\.sqlstd\.confwhitelist\.append\=\'mapreduce\.job\.\*\|dfs\.\*\'/hadoop' /usr/local/kylin/kylin.properties
当我执行上述命令时我没有得到任何输出,它正在等待另一个 input.Can 有人帮助我解决这个问题?
这里:
sed -i "s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g" /usr/local/kylin/kylin.properties
将输出:
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx
或仅替换文件中的第一次出现:
sed -i "0,/root.*dfs/{s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g}" /usr/local/kylin/kylin.properties
当您想用文字字符串替换文字字符串时,请使用像 awk 这样理解文字字符串的工具,而不是像 sed 这样只理解正则表达式和支持反向引用的替换的工具,然后您需要小心地转义不同方式的元字符和定界符(参见
$ cat tst.awk
BEGIN {
map["root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*'"] = "hadoop"
map["localhost"] = "ip-00-00-00-000.ec2.internal"
}
{
for (str in map) {
if ( s = index([=10=],str) ) {
[=10=] = substr([=10=],1,s-1) map[str] substr([=10=],s+length(str))
}
}
print
}
$ awk -f tst.awk file
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx