Home > database >  How to replace quotation marks with angle brackets between two patterns recursively for all file in
How to replace quotation marks with angle brackets between two patterns recursively for all file in

Time:11-18

The repository I am working on has multiple source files in a non-flat directory structure, e.g.

project
│   main.cpp
│
└───moduleA
    │   A.cpp

All these source files have code something like

#include "A.h"

WINDOWS_DISABLE_WARNING
#include "externalA.h"
#include "externalB.h"
WINDOWS_ENABLE_WARNING

// more code

How can I use sed to replace all quotation marks include with angle brackets include between WINDOWS_DISABLE_WARNING macro and WINDOWS_ENABLE_WARNING macro for all files like below recursively?

#include "A.h"

WINDOWS_DISABLE_WARNING
#include <externalA.h>
#include <externalB.h>
WINDOWS_ENABLE_WARNING

// more code

I know how to replace simple strings recursively like find ./ -type f -exec sed -i 's/oldtext/newtext/' {} \;, but I am struggling to figure out how to replace quotation marks with angle brackets between two patterns.

The reason I am doing is this is because Visual Studio recently introduced /external:anglebrackets, if this flag is enabled, any headers included with angle brackets are treated as external, and the warnings coming from it can be turned off via /external:W0. That means no more ugly macros like WINDOWS_DISABLE_WARNING which is defined as __pragma(warning(push,0)) if on Windows, otherwise empty, via CMake's target_compile_definitions and similarly WINDOWS_ENABLE_WARNING which is defined as __pragma(warning(pop)) if on Windows, otherwise empty, via CMake's target_compile_definitions. Since using sed to remove the macros recursively is pretty straightforward, eventually the code can become clean like the below when working with loosely written third-party libraries with the new /external flags enabled.

#include "A.h"

#include <externalA.h>
#include <externalB.h>

// more code

CodePudding user response:

Read about addressing lines in sed

find ... -exec sed -i '/WINDOWS_DISABLE_WARNING/,/WINDOWS_ENABLE_WARNING/ { s/"/</; s/"/>/ }' '{}'  

Make sure to back your files up (sed -i.bak) (or omit the -i option) before experimenting with -i

  • Related