shell - 有人可以为我提供一个简单的搜索和替换脚本吗?

标签 shell replace

是否可以制作一个(Perl 或任何在 Mac OS X 上运行的)脚本来转换

\section{long text}
\sectionmark{short text}

\section[long text]{long text\sectionmark{short text}}

或者替代

\section{long text}[short text]

我无法确保长文本中没有换行符,或者\section\sectionmark之间是否有换行符>.

此问题与讨论的问题相关 here TeX.SX。

最佳答案

awk '/\\section{long text}/ { oldline=$0
                              getline
                              gsub("{","[",oldline)
                              gsub("}","]",oldline) 
                              print gensub("(.*)\\[(.*)\\]","\\1[\\2]{\\2","g",oldline) $0 "}"
                              getline
                            }
     1' INPUTFILE

如果长文本中没有换行符并且\section\sectionmark之间没有空行,将为您执行此操作。如果您有其中任何一个,您仍然可以对其进行修改。

所以回答你的问题:是的,这是可能的。

更新

这是一个使用 awk 的可行解决方案:

awk '/\\section{/ { oldline=$0
                    if ( oldline ~ /}/ ) {
                        lt=gensub(".*{([^}]+)}.*","\\1","g",oldline)
                    } else {
                        lt=gensub(".*{(.*)","\\1","g",oldline) 
                        getline tmp
                        while ( tmp !~  "}" ) {
                            lt=lt "\n" tmp
                            getline tmp
                        }
                        lt=lt "\n" gensub("}.*","","g",tmp)
                    }
                    getline
                    while ( $0 !~ /\\sectionmark/ ) {
                        getline
                    }
                    printf("\\section[%s]{%s%s}\n",lt,lt,$0)
                    getline
                  }
     ! /\\section{/ { print }' INPUT_FILE

注意:如果 long text}\sectionmark 之间出现任何内容,它不会处理,例如:

\section{long text}**THIS TEXT WILL BE SKIPPED!!**
\sectionmark{short text}

您可以在 ACTION HERE 中看到它!

如果您想删除长文本中的新行,只需将每个"\n"替换为""脚本。

关于shell - 有人可以为我提供一个简单的搜索和替换脚本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9096695/

相关文章:

linux - sed 提取给定日期之间的日志

c - 如何正确创建和使用makefile

html - 在django中截断html文本

jquery 用另一个#div 的内容替换#div 的内容?

regex - 如何使用 sed 将一个文件中的模式替换为另一个文件的内容?

linux - 使用 cat 输出运行 bash 脚本的问题(额外引号)

c++ - 有双向管道之类的东西吗?我希望输入和输出在两个简单程序之间交互

arrays - 在 bash v.3 中迭代数组

java - java中如何替换字符串

regex - Powershell正则表达式用可变长度的字符串替换数字