替换xargs变量返回空字符串

时间:2017-06-14 23:31:35

标签: string bash sed replace xargs

我需要在目录树中搜索XML文件,并在另一个目录(staging_ojs_pootle)上为它们创建链接,用文件路径命名这些链接(用每个点替换斜杠)。

bash命令不起作用,我卡在更换部件上。看起来像xargs中的变量,名为' file',在替换代码(${file/\//.})

中无法访问
find directory/ -name '*.xml' | xargs  -I 'file' echo "ln" file staging_ojs_pootle/${file/\//.}

$ {}内部的替换为我提供了一个空字符串。

尝试使用sed但正则表达式替换全部或仅替换最后一个斜杠:/

 find directory/ -name '*.xml' | xargs  -I 'file' echo "ln" file staging_ojs_pootle/file |sed -e '/^ln/s/\(staging_ojs_pootle.*\)[\/]\(.*\)/\1.\2/g'

问候

2 个答案:

答案 0 :(得分:0)

试试这个:

$ find directory/ -name '*.xml' |sed -r 'h;s|/|.|g;G;s|([^\n]+)\n(.+)|ln \2 staging_ojs_pootle/\1|e'

例如:

$ mkdir -p /tmp/test
$ touch {1,2,3,4}.xml
# use /tmp/test as staging_ojs_pootle
$ find /tmp/test -name '*.xml' |sed -r 'h;s|/|.|g;G;s|([^\n]+)\n(.+)|ln \2 /tmp/test/\1|e'
$ ls -al /tmp/test
total 8
drwxr-xr-x. 2 root root 4096 Jun 15 13:09 .
drwxrwxrwt. 9 root root 4096 Jun 15 11:45 ..
-rw-r--r--. 2 root root    0 Jun 15 11:45 1.xml
-rw-r--r--. 2 root root    0 Jun 15 11:45 2.xml
-rw-r--r--. 2 root root    0 Jun 15 11:45 3.xml
-rw-r--r--. 2 root root    0 Jun 15 11:45 4.xml
-rw-r--r--. 2 root root    0 Jun 15 11:45 .tmp.test.1.xml
-rw-r--r--. 2 root root    0 Jun 15 11:45 .tmp.test.2.xml
-rw-r--r--. 2 root root    0 Jun 15 11:45 .tmp.test.3.xml
-rw-r--r--. 2 root root    0 Jun 15 11:45 .tmp.test.4.xml
# if don NOT use the e modifier of s command, we can get the final command
$ find /tmp/test -name '*.xml' |sed -r 'h;s|/|.|g;G;s|([^\n]+)\n(.+)|ln \2 /tmp/test/\1|' 
ln /tmp/test/1.xml /tmp/test/.tmp.test.1.xml
ln /tmp/test/2.xml /tmp/test/.tmp.test.2.xml
ln /tmp/test/3.xml /tmp/test/.tmp.test.3.xml
ln /tmp/test/4.xml /tmp/test/.tmp.test.4.xml

说明:

  1. 对于每个xml文件,使用h将原始文件名保存在hold space
  2. 使用s|/|.|g将所有/替换为.以获取xml文件名。
  3. 使用Ghold space追加到pattern space,然后pattern spaceCHANGED_FILENAME\nORIGIN_FILENAME
  4. 使用s|([^\n]+)\n(.+)|ln \2 staging_ojs_pootle/\1|e'将命令与CHANGED_FILENAMEORIGIN_FILENAME合并,然后使用e修饰符s命令执行上面汇编的命令,这将执行实际工作
  5. 希望这有帮助!

答案 1 :(得分:0)

如果您可以确定XML文件的名称不包含任何分词符号,则可以使用以下内容:

find directory -name "*.xml" | sed 'p;s/\//./' | xargs -n2 echo ln