Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 - Fatal编程技术网

如何替换。。从bash脚本中的字符串开始?

如何替换。。从bash脚本中的字符串开始?,bash,Bash,我必须从Bash脚本中的文件中删除。字符。例如: 我有一些字符串,比如: some/../path/to/file some/ab/path/to/file 更换后,它应该是 some/path/to/file some/ab/path/to/file 我使用了下面的代码 DUMMY_STRING=/../ TEMP_FILE=./temp.txt sed s%${DUMMY_STRING}%/%g ${SRC_FILE} > ${TEMP_FILE} cp ${TEMP_FILE}

我必须从Bash脚本中的文件中删除
字符。例如:

我有一些字符串,比如:

some/../path/to/file
some/ab/path/to/file
更换后,它应该是

some/path/to/file
some/ab/path/to/file
我使用了下面的代码

DUMMY_STRING=/../
TEMP_FILE=./temp.txt
sed s%${DUMMY_STRING}%/%g ${SRC_FILE} > ${TEMP_FILE}
cp ${TEMP_FILE} ${SRC_FILE}
它正在替换第1行中的
/../
;但它也从第二行删除了
/ab/
。这是不可取的。我知道它正在考虑
/../
,因为某些正则表达式和
/ab/
与此正则表达式匹配。但我只想替换那些
/../

请提供一些帮助

谢谢


NN

sed
中,
是一个元字符,意思是“任何字符”。要隐藏其特殊含义,请使用反斜杠将其转义:

sed -e 's%/\.\./%/%g' $src_file > $temp_file
请注意,在删除类似的
/../
之后,您引用的是不同的文件。要引用与以前相同的名称(在没有符号链接的情况下,这会使事情变得复杂),您需要删除
/../
前面的目录组件。因此:

some/../path/to/file
path/to/file
引用同一个文件,假设
some
是一个目录,而不是其他地方的符号链接,但一般来说,
some/path/to/file
是一个不同的文件(尽管符号链接可能会混淆该断言)


注意在
echo
命令中,在变量
“$x”
周围小心地使用了双引号。我可以在作业中使用单引号或双引号,也可以得到相同的结果


使用标准的
sed
(shell是
/bin/sh
,又名
bash
3.2.X)在Mac OS X 10.7.4上进行测试,但在任何系统上的结果都是相同的。

sed
中的元字符,意思是“任何字符”。要隐藏其特殊含义,请使用反斜杠将其转义:

sed -e 's%/\.\./%/%g' $src_file > $temp_file
请注意,在删除类似的
/../
之后,您引用的是不同的文件。要引用与以前相同的名称(在没有符号链接的情况下,这会使事情变得复杂),您需要删除
/../
前面的目录组件。因此:

some/../path/to/file
path/to/file
引用同一个文件,假设
some
是一个目录,而不是其他地方的符号链接,但一般来说,
some/path/to/file
是一个不同的文件(尽管符号链接可能会混淆该断言)


注意在
echo
命令中,在变量
“$x”
周围小心地使用了双引号。我可以在作业中使用单引号或双引号,也可以得到相同的结果


使用标准的
sed
(shell是
/bin/sh
,又名
bash
3.2.X)在Mac OS X 10.7.4上进行测试,但在任何系统上的结果都是一样的。

这并没有按预期工作。它还删除了我不想要的“/tx/”。我只想让序列“/…/”替换为“/”。@Niranjan:您是在
sed
脚本中使用单引号还是双引号?它们是不可互换的——至少在这种情况下是不可互换的。或者你仍然没有使用任何引号?如果不使用单引号,则必须使用更多反斜杠。根据经验,除非需要插入shell变量,否则请将
sed
脚本用单引号括起来。明白了。我根本没有在SED命令中使用任何引号。你的建议是建议使用单一报价。这个单引号
sed-e的%/\.\./%/%g'${SRC\u FILE}>${TEMP\u FILE}
解决了这个问题。谢谢你的帮助。非常感谢。这不是我们想要的。它还删除了我不想要的“/tx/”。我只想让序列“/…/”替换为“/”。@Niranjan:您是在
sed
脚本中使用单引号还是双引号?它们是不可互换的——至少在这种情况下是不可互换的。或者你仍然没有使用任何引号?如果不使用单引号,则必须使用更多反斜杠。根据经验,除非需要插入shell变量,否则请将
sed
脚本用单引号括起来。明白了。我根本没有在SED命令中使用任何引号。你的建议是建议使用单一报价。这个单引号
sed-e的%/\.\./%/%g'${SRC\u FILE}>${TEMP\u FILE}
解决了这个问题。谢谢你的帮助。非常感谢你。