改进sed程序条件

改进sed程序条件,sed,Sed,我使用这个代码是根据这个 我的意思是,在文件名中有一个世界,它作为另一个文件名的一部分被重复。然后增加了一个-更多次 我试过了 sed -f <(printf 's/{%s}/{s-&}/g\n' "${files[@]%.tex}") 我需要找到{%s}和{和%s之间的一个-place,从这个问题上看,如何解决冲突输入还不清楚。特别是,代码将用a-file1替换file1的任何实例,甚至像“foofile1”这样的东西 表面上看,目标似乎是更改标记(例如,foofile1不应受

我使用这个代码是根据这个

我的意思是,在文件名中有一个世界,它作为另一个文件名的一部分被重复。然后增加了一个-更多次

我试过了

sed -f <(printf 's/{%s}/{s-&}/g\n' "${files[@]%.tex}")

我需要找到{%s}和{和%s

之间的一个-place,从这个问题上看,如何解决冲突输入还不清楚。特别是,代码将用a-file1替换file1的任何实例,甚至像“foofile1”这样的东西

表面上看,目标似乎是更改标记(例如,foofile1不应受到file1替换的影响。这可以通过在文件名前后添加单词边界断言(\b)来实现。这将防止模式在其他较长的文件名中匹配

printf 's/\\b%s\\b/a-&/g\n' "${names[@]%.txt}"

这个问题不清楚如何解决冲突输入。特别是,代码将用a-file1替换file1的任何实例,甚至像“foofile1”这样的东西

表面上看,目标似乎是更改标记(例如,foofile1不应受到file1替换的影响。这可以通过在文件名前后添加单词边界断言(\b)来实现。这将防止模式在其他较长的文件名中匹配

printf 's/\\b%s\\b/a-&/g\n' "${names[@]%.txt}"

由于此解释太长,无法发表评论,因此在此处添加一个答案。我不确定我以前的答案是否清楚,但我的答案考虑到了这种情况,只会替换确切的文件名,而不会混合使用文件名

printf 's/\\b%s\\b/a-&/g\n' "${names[@]%.txt}"
假设以下是数组值和输入文件:

names=(file1.txt file2.txt file3file2.txt)
echo "${names[*]}"
file1.txt file2.txt file3file2.txt

cat file1
TEXT
\connect{file1}
\begin{file2}
\connect{file3}
TEXT
75
现在,当我们运行以下代码时:

awk -v arr="${names[*]}" '
BEGIN{
  FS=OFS="{"
  num=split(arr,array," ")
  for(i=1;i<=num;i++){
    sub(/\.txt/,"",array[i])
    array1[array[i]"}"]
  }
}
$2 in array1{
  $2="a-"$2
}
1
' file1

由于此解释太长,无法发表评论,因此在此处添加一个答案。我不确定我以前的答案是否清楚,但我的答案考虑到了这种情况,只会替换确切的文件名,而不会混合使用文件名

printf 's/\\b%s\\b/a-&/g\n' "${names[@]%.txt}"
假设以下是数组值和输入文件:

names=(file1.txt file2.txt file3file2.txt)
echo "${names[*]}"
file1.txt file2.txt file3file2.txt

cat file1
TEXT
\connect{file1}
\begin{file2}
\connect{file3}
TEXT
75
现在,当我们运行以下代码时:

awk -v arr="${names[*]}" '
BEGIN{
  FS=OFS="{"
  num=split(arr,array," ")
  for(i=1;i<=num;i++){
    sub(/\.txt/,"",array[i])
    array1[array[i]"}"]
  }
}
$2 in array1{
  $2="a-"$2
}
1
' file1